Как отлаживать, когда программа вылетает при удалении? - PullRequest
1 голос
/ 25 июля 2011

Когда delete выполняет программу, происходит сбой.Я попробовал следующий код для проверки поврежденного блока кучи, но if условие приводит к ложному.

int  rc;
if (_HEAPOK != (rc = _heapchk())) 
{
    switch(rc) 
    {
        case _HEAPEMPTY:
            puts("The heap has not been initialized.");
            break;
        case _HEAPBADNODE:
            puts("A memory node is corrupted or the heap is damaged.");
            break;
        case _HEAPBADBEGIN:
            puts("The heap specified is not valid.");
            break;
    }
}

полный код можно найти здесь: http://cyberkinetica.homeunix.net/os2tk45/xpg4ref/157_L2__heapchkValidateDefa.html

Пожалуйста, дайте мне знать, как отлаживатьв этом случае.

РЕДАКТИРОВАТЬ:

Я попытался отладить в файле:

...\Microsoft Visual Studio 9.0\VC\crt\src\dbgheap.c

, и он не работает в следующей функции:

extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer( const void * pUserData)

Комментарии к этой функции:

Цель: Проверить, что указатель является не только действительным, но и указанным«местная» куча.Указатели из другой копии среды выполнения C (даже в том же процессе) будут перехвачены.

что это за локальная куча и помогает ли это выяснить проблему?

Ответы [ 3 ]

3 голосов
/ 25 июля 2011

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

*(ptr - 1) = 'x'; // i.e. ptr[-1] = 'x';

После выполнения ptr = malloc() вы выполняете указанную выше команду. Указатель пишет в области памяти, которая выходит за пределы диапазона ; что приводит к неопределенному поведению. К счастью, система вылетает.

1 голос
/ 25 июля 2011

Как выполнить отладку при сбое программы при удалении?

Запустите его под Valgrind, если вы работаете в Linux или с другим отладчиком памяти , доступным на вашей платформе.

0 голосов
/ 25 июля 2011

Отладка отладочной сборки, наличие исходного кода, установка VS - это одна из самых простых вещей.Запустите программу в отладчике и посмотрите, где он падает.Проверьте стек вызовов и посмотрите, куда он ведет.

Для вашей проблемы, поддельный delete (не имеющий new) может быть источником проблемы, с которой вы сталкиваетесь.Проверьте код!

...