在C / C ++中使用malloc和free并获取错误HEAP CORRUPTION DETECTED

时间:2010-11-26 19:26:05

标签: c loops malloc free heap-memory

我在运行免费(位置)时遇到问题。

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获得的完整错误消息是HEAP CORRUPTION DETECTED:正常块(#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是什么,但这对我来说都是很新的概念,我认为我可以在不知道这些CRT的情况下解决这个问题。

for循环将值分配给分配给位置的内存,除此之外我无法想到为什么会导致问题....实际上现在我想到了它。我将循环更改为高度+ 1以解决问题。

2 个答案:

答案 0 :(得分:3)

应该是:

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

或:

position = malloc(hieght * sizeof *position);

这是你所拥有的未定义行为。您可能只是幸运,因为intint*的大小相同。

编写循环的典型正确方法是:

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

你也可以在这里使用calloc:

position = calloc(hieght, sizeof *position);

并且内存将为您归零,因此您无需循环。

另外,如果这确实是C,则演员阵容是多余的。

答案 1 :(得分:0)

我认为循环中的问题是&lt; =它应该是&lt;。 因此,循环过多一次并破坏堆上的下一个项目!