我正在尝试修改 VirtualTreeView 以在设计模式下查看树节点中的数据。
分配节点内存在私有静态方法中,所以我对此无能为力。我正在尝试重新分配内存以匹配新的大小。
出于测试目的,我正在尝试重新分配相同数量的内存:
ReallocMemory(Node, sizeof(Node^))
但是 IDE 在抛出大量 AV 的随机迭代中挂起。由于我对内存分配的了解非常缺乏,我想我忘记了一些东西。你能指点我吗?
我正在尝试修改 VirtualTreeView 以在设计模式下查看树节点中的数据。
分配节点内存在私有静态方法中,所以我对此无能为力。我正在尝试重新分配内存以匹配新的大小。
出于测试目的,我正在尝试重新分配相同数量的内存:
ReallocMemory(Node, sizeof(Node^))
但是 IDE 在抛出大量 AV 的随机迭代中挂起。由于我对内存分配的了解非常缺乏,我想我忘记了一些东西。你能指点我吗?
ReallocMemory
是一个函数。它返回新的指针值;它不修改它的论点。您想改为调用ReallocMem
,或者使用函数的结果:
ReallocMem(Node, SizeOf(Node^));
或者
Node := ReallocMemory(Node, SizeOf(Node^));
当这些函数中的任何一个无法就地调整内存块的大小时,它会分配新内存,将旧内容复制到新缓冲区中,然后释放原始缓冲区。如果您忽略ReallocMemory
结果,那么您已经丢弃了新指针并在Node
变量中保留了旧的、陈旧的指针。继续使用过时的指针将解释访问冲突和其他不可预测的行为。
这些函数有两个版本以实现 C++ 兼容性。C++ 没有 Delphi 的“编译器魔法”,它允许编译器拥有一个ReallocMem
接受和修改任何指针类型的函数。
该ReallocMemory
函数看起来像 C++realloc
函数,但它们的行为方式并不完全相同,这就是为什么用函数的返回值直接覆盖输入变量是安全的。当重新分配失败时,该函数会抛出一个异常,就像ReallocMem
,其中 asrealloc
只是返回一个空指针。