Использование malloc и free в C / C ++ и получение ошибки ОБНАРУЖЕНО ПОВРЕЖДЕНИЕ КУЧИ

StackOverflow https://stackoverflow.com/questions/4288039

Вопрос

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

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 присваивает значения памяти, выделенной для position, кроме того, я не могу понять, почему это вызывает проблему....на самом деле, теперь, когда я думаю об этом.Я изменил цикл на высоту + 1, что устранило проблему.

Это было полезно?

Решение

Это должно быть:

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, приведение является излишним.

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top