Использование malloc и free в C / C ++ и получение ошибки HEAP CORRUPTION DETECTEDED - PullRequest
2 голосов
/ 26 ноября 2010

У меня возникла проблема при запуске free (position).

void printTree(nodeT node, int hieght)
{
    int *position;
    position = (int*)malloc(hieght * sizeof(int*));
    for (int i = 0; i <= hieght; i++)
    {
        position[i] = 0;
    }
    BOOLEAN DONE = FALSE;
    while (DONE == FALSE)
    {
        printMoveDown(&node, position);
        printLEAFNode(&node, position);
        DONE = printMoveUp(&node, position);
        printSingleKey(&node, position);
    } 
    free(position);
    position = NULL;
}

Полное сообщение об ошибке, которое я получаю от VS2010, ОБНАРУЖЕНО КОРРУПЦИЕЙ КАРТЫ: после нормального блока (# 64) в 0x00031390.CRT обнаружил, что приложение записало в память после завершения кучи.

Отладчик сообщает, что проблема возникает в то время как в: dbgheap.c

extern "C" void __cdecl _free_dbg_nolock
line 1376:  if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
                if (pHead->szFileName) {..}
                else { this is where the program stops }

Я попытался настроить ту же ситуацию с меньшими затратамичто происходит, чтобы увидеть, смогу ли я сузить проблему.

void function (int y)
{
    int *x;
    x = (int*)malloc(y * sizeof(int*));
    free(x);
    x = NULL;
}

Это то же самое, что и выше, без цикла for и while.Это работает.Удаление цикла for - вот что заставило его работать.Я не знаю почему.Я посмотрел, что такое ЭЛТ, но для меня это были довольно новые концепции, и я предполагаю, что могу решить эту проблему, не зная об этих ЭЛТ.

Цикл for присваивает значения памяти, выделенной для позиции, кроме того, я не могу понять, почему это вызывает проблему ... на самом деле, теперь, когда я об этом думаю.Я изменил цикл на высоту + 1, что решило проблему.

Ответы [ 2 ]

3 голосов
/ 26 ноября 2010

Должно быть:

position = malloc(hieght * sizeof(int));

или

position = malloc(hieght * sizeof *position);

Это неопределенное поведение, как у вас. Возможно, вам просто повезло, потому что int и int* имеют одинаковый размер.

И типичный правильный способ написания цикла:

for (int i = 0; i < hieght; i++)
{
    position[i] = 0;
}

Вы также можете использовать calloc здесь:

position = calloc(hieght, sizeof *position);

и память обнулится для вас, так что вам не придется зацикливаться.

Кроме того, если это действительно C, приведение является излишним.

0 голосов
/ 06 августа 2014

Я думаю, что проблема в цикле в том, что <= должно быть <.Следовательно, цикл оборачивается один раз слишком много и портит следующий элемент в куче! </p>

...