Reputation: 1313
I'm working on a framework and have run into an issue. I noticed that I was leaking memory by not deleting an object. When I tried to delete this object just before exiting the application I get an error, this one to be exact:
After I got this I grabbed Application Verifier
When running the code it set a breakpoint on the following piece of code:
PIXELFORMATDESCRIPTOR tPfd = {
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
32,
0, 0, 0, 0, 0, 0,
1,
0,
0, 0, 0, 0,
0,
24,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
unsigned int tFormat = ChoosePixelFormat(g_WindowContext, &tPfd);
if( !tFormat ) {
LOG( CRITICAL, "Pixelformat could not be choosen." );
return false;
}
It set a breakpoint on the line with "ChoosePixelFormat(g_WindowContext,&tPfd);" and had the following 'explanation' for it:
VERIFIER STOP 00000301: pid 0x3689C: Invalid TLS index used for current stack trace.
FFFFFFFF : Invalid TLS index.
0000ABBA : Expected lower part of the index.
00000000 : Not used.
00000000 : Not used.
I don't really get what is going on, the lines above these pieces of code are as follows:
g_Window = CreateWindowEx (
0,
PROJECT_NAME, // window class
PROJECT_NAME, // window title
tStyle, // visibility settings
tX, tY,
tW, tH,
NULL,
NULL,
tWindowClass.hInstance,
NULL
);
if(!g_Window) {
LOG( CRITICAL, "Window could not be created." );
return false;
}
g_WindowContext = GetDC(g_Window);
if( !g_WindowContext ) {
return false;
}
The variables used here are:
HDC g_WindowContext;
HWND g_Window;
The object I am trying to delete is nothing special, the object is not corrupt while the application is running. I can use the object, I've tried using all its functions and they all work as expected time after time. Just when I try to delete the object at the end it gives the error message. The object is deleted just below the main application loop when everything is cleaned up. Nothing is using it at this point nothing seems to be the problem, when setting a breakpoint the pointer to the object itself is valid as well.
If anybody would be able to help me it would be greatly appreciated, if you need anymore information or pieces of code please let me know.
Upvotes: 1
Views: 2559
Reputation: 1
Your original question included a dump with the line "VERIFIER STOP 00000301: pid 0x3689C: Invalid TLS index used for current stack trace. "
If VERIFIER is Application Verifier, then maybe this is the cause:
http://support.microsoft.com/kb/842901
Symptom: When you use Windows Application Verifier to verify a custom-built program, it may stop responding or crash.
If you create a dump file, the file includes an entry for an access violation in OpenGL32!InitializeThread+043.
Cause: This problem occurs when OpenGL creates a table entry in a thread local storage (TLS) slot in the overflow area. However, Windows Application Verifier assumes that all TLS slots that are used by OpenGL are in the primary area, not in the overflow area. This causes Windows Application Verifier to generate an access violation.
Upvotes: -1
Reputation: 1313
Fixed the problem, the last buffer I was deleting was buffer in video ram, I obviously can't delete this one. No heap corruption going on at all just a logical thinking flaw.
Thank you to the people that tried to answer this one and help me.
Upvotes: 2
Reputation: 37458
What happens if you try deleting the object right after you've created it and then exiting the program immediately? If you've not got masses of code in your project, just try shuffling that delete / exit further along the line until it starts going pop again. You can speed up this process by divide-and-conquering through all the executed code to home in on the source of the corruption.
Can you show us precisely where the crash happens? A complete example would help us diagnose the fault but without seeing that, it's very difficult to narrow it down any further.
Upvotes: 2
Reputation: 59997
Your objects are on the stack - and therefore do not require deleting. For delete
to be required you need to have used new
in the firet place.
So where is the new
and the delete
in your code.
Upvotes: 1