2010-11-26 7 views
2

У меня возникла проблема при запуске бесплатной (позиции).Использование malloc и бесплатно в C/C++ и получение ошибки HEAP CORRUPTION DETECTED

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 - вот что заставило его работать. Я не знаю почему. Я посмотрел, что такое CRT, но для меня это были все новые концепции, и я предполагаю, что могу решить эту проблему, не зная об этих ЭЛТ.

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

ответ

3

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

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

Спасибо, используя calloc, сделали вещи проще. Я стараюсь избегать использования <= in циклов для обеспечения согласованности. Я считаю, что я изменил его из-за проблем, которые у меня были, и пробовал. – MykC 2010-11-26 20:23:18

+1

Действительно, ваш ответ должен удалить уродливое и потенциально опасное действие из кода OP. – 2010-11-26 20:23:34

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^