gpt4 book ai didi

c - 在 C/C++ 中使用 malloc 和 free 并得到错误 HEAP CORRUPTION DETECTED

转载 作者:行者123 更新时间:2023-12-04 06:40:41 25 4
gpt4 key购买 nike

运行 free(position) 时遇到问题。

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: after normal block (#64) at 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 循环将值分配给为位置分配的内存,除此之外我想不出为什么这会导致问题......实际上现在我想到了它。我将循环更改为 height + 1 以解决问题。

最佳答案

它应该是:

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,则类型转换是多余的。

关于c - 在 C/C++ 中使用 malloc 和 free 并得到错误 HEAP CORRUPTION DETECTED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4288039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com