在C/C ++中使用Malloc并免费获取错误堆损坏
-
28-09-2019 - |
题
自由(位置)运行时,我有问题。
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收到的完整错误消息检测到了堆的损坏:在0x00031390的普通块(#64)之后。 CRT检测到该应用程序在堆结束后写入内存。
调试器说问题发生在以下内容时发生:dbgheap.c.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循环和循环。这有效。删除for循环是使它起作用的原因。我不知道为什么。我查看了CRT是什么,但这对我来说都是非常新的概念,我认为我可以在不知道这些CRT的情况下解决这个问题。
for循环将值分配给分配给位置的内存,除此之外,我无法想到为什么会引起问题。...实际上我考虑了这一点。我将循环更改为高度 + 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,则演员表是多余的。
其他提示
我认为循环中的问题是<=,它确实应该是<。因此,循环一次绕过太多,并破坏了堆上的下一个项目!
不隶属于 StackOverflow