Возможная проблема повреждения кучи при удалении объекта - PullRequest
1 голос
/ 13 сентября 2011

Я работаю над фреймворком и столкнулся с проблемой. Я заметил, что я терял память, не удаляя объект. Когда я пытался удалить этот объект непосредственно перед выходом из приложения, я получаю сообщение об ошибке, а именно:

Error on closing the application

После того, как я получил это, я схватил Проверка приложения

При запуске кода он устанавливает точку останова для следующего фрагмента кода:

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 ]

2 голосов
/ 13 сентября 2011

Что произойдет, если вы попытаетесь удалить объект сразу после его создания и сразу же выйти из программы?Если у вас нет массы кода в вашем проекте, просто попробуйте перетасовать это удаление / выход дальше по линии, пока оно не начнет всплывать снова.Вы можете ускорить этот процесс, разделяя и захватывая весь исполняемый код, чтобы определить источник повреждения.

Можете ли вы точно показать нам, где происходит сбой?Полный пример поможет нам диагностировать ошибку, но, не видя этого, очень трудно сузить ее дальше.

1 голос
/ 13 сентября 2011

Исправлена ​​проблема, последний буфер, который я удалял, был буфером в ram видео, я явно не могу удалить этот. Никакой коррупции в куче не происходит вообще, просто логический недостаток мышления.

Спасибо людям, которые пытались ответить на этот вопрос и помочь мне.

1 голос
/ 13 сентября 2011

Ваши объекты находятся в стеке и, следовательно, не требуют удаления.Чтобы потребовалось delete, вам нужно использовать new в камине.

Так где же в вашем коде new и delete.

0 голосов
/ 22 сентября 2013

Ваш первоначальный вопрос содержал дамп со строкой «VERIFIER STOP 00000301: pid 0x3689C: неверный индекс TLS, используемый для текущей трассировки стека.»

Если VERIFIER - это Application Verifier, то, возможно, это причина:

http://support.microsoft.com/kb/842901

Симптом: При использовании средства проверки приложений Windows для проверки пользовательской программы она может перестать отвечать или аварийно завершать работу.

Если создатьфайл дампа, файл содержит запись для нарушения прав доступа в OpenGL32! InitializeThread + 043.

Причина: эта проблема возникает, когда OpenGL создает запись таблицы в слоте локального хранилища потока (TLS) в области переполнения.Однако Windows Application Verifier предполагает, что все слоты TLS, используемые OpenGL, находятся в основной области, а не в области переполнения.Это заставляет Windows Application Verifier создавать нарушение прав доступа.

...