Использование malloc и free в C / C ++ и получение ошибки ОБНАРУЖЕНО ПОВРЕЖДЕНИЕ КУЧИ
-
28-09-2019 - |
Вопрос
У меня возникла проблема при запуске 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, приведение является излишним.
Другие советы
Я думаю, что проблема в цикле заключается в <= что действительно должно быть <.Следовательно, цикл повторяется на один раз слишком часто и повреждает следующий элемент в куче!