【发布时间】:2011-06-03 02:34:36
【问题描述】:
问题在标题中...我搜索但找不到任何东西。
编辑:
我真的认为没有必要解释这一点,但是因为人们认为我所说的没有意义(而且我问错了问题),所以问题就在这里:
由于人们似乎非常对所有问题的“根本”原因感兴趣,而不是对提出的实际问题感兴趣(因为这显然有助于更好地解决问题,让我们看看它是否有效),问题来了:
我正在尝试创建一个基于 NTDLL.dll 的 D 运行时库,以便我可以将该库用于 Win32 子系统以外的子系统。所以这迫使我只链接 NTDLL.dll。
是的,我知道这些函数是“未记录的”并且可能随时更改(尽管我打赌一百美元 wcstombs 仍然会做同样的事情确切 20年后,如果它仍然存在的话)。是的,我知道人们(尤其是微软)不喜欢链接到那个库的开发人员,我可能会因为这里而受到批评。是的,以上两点意味着像 chkdsk 和在 Win32 子系统之前运行的碎片整理程序这样的程序甚至不应该首先创建,因为实际上不可能与 kernel32 之类的任何东西链接.dll 或 msvcrt.dll 并且仍然具有 NT-native 可执行文件,因此我们开发人员应该假装这些阶段是我们永远无法企及的。
但是不,我怀疑这里的任何人都希望我粘贴几千行代码并帮助我查看它们并试图找出为什么没有失败的内存分配是被我正在修改的源代码拒绝。所以这就是为什么我问了一个与“根本”原因不同的问题,尽管这被认为是社区的最佳做法。
如果仍然没有任何意义,请随时在下面发布 cmets! :)
编辑 2:
经过大约 8 个小时的调试,我终于找到了问题所在:
事实证明,RtlReAllocateHeap() 确实不会自动像RtlAllocateHeap() 那样工作,如果给它的指针是NULL。
【问题讨论】:
-
只是为了完成其他答案.. malloc() 记录它已分配的块,并在释放某些内容时将指针与该记录进行比较以检查它是否已分配。
-
@BlackBear:是的,这就是为什么它让我想知道为什么它不能只检查指针是否在块内(这有多难??)......跨度>
-
@BlackBear:实际上,在大多数实现中,堆只保存关于空闲块的信息。 free() 所需的数据(例如块的大小)由 malloc() 附加到分配的块中,从传递给 free() 以访问记录的指针中减去记录的大小。如果实现包含验证签名,则可以进行错误检测,否则无效记录将导致堆损坏。
-
@Clifford:啊,好吧,这很有道理。谢谢。
-
哎哟:RtlReAllocateHeap() 不处理被赋予 NULL 指针?太糟糕了,MS 没有让它表现得像标准的
realloc()函数,特别是因为它只需要几行代码。这是一个很难学习的教训。
标签: c memory-management free calloc