我正在研究一个框架并遇到了一个问题。我注意到我没有删除对象而泄漏内存。当我在退出应用程序之前尝试删除此对象时,我收到一个错误,确切地说是这个错误:
在我得到这个之后,我抓住了Application Verifier
运行代码时,它会在以下代码中设置断点:
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;
}
使用“ChoosePixelFormat(g_WindowContext,& tPfd)”在行上设置断点;“并对其进行了以下“解释”:
VERIFIER STOP 00000301:pid 0x3689C:用于当前堆栈跟踪的无效TLS索引。
FFFFFFFF : Invalid TLS index.
0000ABBA : Expected lower part of the index.
00000000 : Not used.
00000000 : Not used.
我真的不知道发生了什么,这些代码上面的行如下:
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;
}
这里使用的变量是:
HDC g_WindowContext;
HWND g_Window;
我试图删除的对象没什么特别的,在应用程序运行时对象没有损坏。我可以使用该对象,我已经尝试使用它的所有功能,它们都按预期一次又一次地工作。就在我尝试在最后删除对象时,它会给出错误消息。清除所有内容后,在主应用程序循环下方删除该对象。没有什么东西在这一点上使用它似乎没什么问题,在设置断点时,指向对象本身的指针也是有效的。
如果有人能够帮助我,我们将不胜感激,如果您需要更多信息或代码,请告知我们。
答案 0 :(得分:2)
如果您在创建对象后立即尝试删除该对象,然后立即退出该程序,会发生什么?如果您的项目中没有大量的代码,只需尝试随机删除/退出该行,直到它再次开始弹出为止。您可以通过划分并征服所有已执行的代码来加速这一过程,并将其置于腐败源头。
你能准确地告诉我们发生撞车的地方吗?一个完整的例子可以帮助我们诊断故障但是没有看到它,很难进一步缩小它。
答案 1 :(得分:1)
您的对象在堆栈中 - 因此不需要删除。要求delete
,您需要在火场中使用new
。
因此代码中的new
和delete
在哪里。
答案 2 :(得分:1)
修正了问题,我删除的最后一个缓冲区是视频ram中的缓冲区,我显然无法删除这一个。没有堆腐败只是一个逻辑思维缺陷。
感谢那些试图回答这个并帮助我的人。
答案 3 :(得分:-1)
您的原始问题包含一行转储,其中包含“VERIFIER STOP 00000301:pid 0x3689C:用于当前堆栈跟踪的无效TLS索引。”
如果VERIFIER是Application Verifier,那么可能是原因:
http://support.microsoft.com/kb/842901
症状:使用Windows Application Verifier验证自定义程序时,它可能会停止响应或崩溃。
如果您创建转储文件,该文件包含OpenGL32中的访问冲突条目!InitializeThread + 043。
原因:当OpenGL在溢出区域的线程本地存储(TLS)插槽中创建表条目时,会出现此问题。但是,Windows Application Verifier假定OpenGL使用的所有TLS插槽都位于主区域,而不是溢出区域。这会导致Windows应用程序验证程序生成访问冲突。