删除对象时可能存在堆损坏问题

时间:2011-09-12 21:24:55

标签: c++ visual-studio visual-c++ heap corruption

我正在研究一个框架并遇到了一个问题。我注意到我没有删除对象而泄漏内存。当我在退出应用程序之前尝试删除此对象时,我收到一个错误,确切地说是这个错误:

Error on closing the application

在我得到这个之后,我抓住了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;

我试图删除的对象没什么特别的,在应用程序运行时对象没有损坏。我可以使用该对象,我已经尝试使用它的所有功能,它们都按预期一次又一次地工作。就在我尝试在最后删除对象时,它会给出错误消息。清除所有内容后,在主应用程序循环下方删除该对象。没有什么东西在这一点上使用它似乎没什么问题,在设置断点时,指向对象本身的指针也是有效的。

如果有人能够帮助我,我们将不胜感激,如果您需要更多信息或代码,请告知我们。

4 个答案:

答案 0 :(得分:2)

如果您在创建对象后立即尝试删除该对象,然后立即退出该程序,会发生什么?如果您的项目中没有大量的代码,只需尝试随机删除/退出该行,直到它再次开始弹出为止。您可以通过划分并征服所有已执行的代码来加速这一过程,并将其置于腐败源头。

你能准确地告诉我们发生撞车的地方吗?一个完整的例子可以帮助我们诊断故障但是没有看到它,很难进一步缩小它。

答案 1 :(得分:1)

您的对象在堆栈中 - 因此不需要删除。要求delete,您需要在火场中使用new

因此代码中的newdelete在哪里。

答案 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应用程序验证程序生成访问冲突。