为什么我打电话给Realloc Memory后我的程序崩溃了?

时间:2012-12-21 15:18:05

标签: delphi pointers memory-management delphi-7 virtualtreeview

我正在尝试修改VirtualTreeView以在设计模式下查看树节点中的数据。

分配节点内存是私有静态方法,所以我无法做任何事情。我正在尝试重新分配内存以匹配新的大小。

出于测试目的,我正在尝试重新分配相同数量的内存:

ReallocMemory(Node, sizeof(Node^))

但IDE在随机迭代中挂起了大量的AV。由于我对内存分配的了解非常缺乏,我认为我忘记了一些事情。你能指点我吗?

1 个答案:

答案 0 :(得分:7)

ReallocMemory功能。它返回新的指针值;它不会修改它的论点。您想要调用ReallocMem,或者使用函数的结果:

ReallocMem(Node, SizeOf(Node^));

Node := ReallocMemory(Node, SizeOf(Node^));

当其中任何一个函数无法就地调整内存块时,它会分配新内存,将旧内容复制到新缓冲区中,然后释放原始缓冲区。如果忽略ReallocMemory结果,那么您已丢弃新指针并在Node变量中保留旧的陈旧指针。继续使用陈旧的指针可以解释访问违规和其他不可预测的行为。


这些函数有两个版本用于C ++兼容性。 C ++没有Delphi的“编译魔术”,这使得编译器可以使用单个ReallocMem函数来接受和修改任何指针类型。

ReallocMemory函数看起来像,就像C ++ realloc函数一样,但它们的行为方式并不完全相同,这就是为什么直接覆盖输入变量是安全的使用函数的返回值。当重新分配失败时,该函数抛出异常,就像ReallocMem一样,其中realloc只返回一个空指针。