传递给free()的指针是否必须指向内存块的开头,还是指向内部?

Meh*_*dad 6 c free memory-management calloc

问题在于标题......我搜索但找不到任何东西.


编辑:

我真的没有必要解释这个问题,但是因为人们认为我说的话没有意义(我问的是错误的问题),这就是问题所在:

由于人们似乎对所有问题的"根"原因非常感兴趣而不是实际提出的问题(因为这显然有助于事情得到更好的解决,让我们看看它是否确实如此),这就是问题所在:

我正在尝试基于NTDLL.dll创建一个D运行时库,以便我可以将该库用于Win32子系统以外的子系统.所以这迫使我只与NTDLL.dll链接.

是的,我知道这些功能是"无证件"的,并且可能随时发生变化(即使我打赌一百美元,如果它仍然存在的话,20年后它仍然wcstombs可以做同样事情).是的,我知道人们(尤其是微软)不喜欢开发人员链接到该库,并且我可能会因此而受到批评.是的,上面的两点意味着在Win32子系统之前运行的程序如chkdsk和碎片整理程序甚至不应该首先创建,因为它实际上不可能与kernel32.dll或msvcrt.dll之类的东西链接.仍然有NT本地可执行文件,所以我们开发人员应该假装这些阶段永远不在我们的范围之内.

,我怀疑这里的任何人都希望我粘贴几千行代码并帮助我查看它们并试图弄清楚为什么我正在修改的源代码拒绝了未失败的内存分配.所以这就是为什么我问起了一个与"根"原因不同的问题,即使这被认为是社区的最佳实践.

如果事情仍然没有意义,请随时在下面发表评论!:)


编辑2:

经过大约8个小时的调试,我终于找到了问题:

事实证明,RtlReAllocateHeap()不会RtlAllocateHeap()指定给它的指针那样自动工作NULL.

Car*_*rum 12

它必须指向块的开头.传递一个空指针是安全的free(),但传递任何未malloc()由其亲属或其中一个亲属分配的指针将导致未定义的行为.有些系统会给你一个运行时错误 - 就像"释放未指向malloced的指针"一样.

编辑:

我写了一个测试程序来获取错误信息.在我的机器上,这个程序:

#include <stdlib.h>

int main(int argc, char **argv)
{
  int *x = malloc(12);
  x++;

  free(x);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

与此消息崩溃:

app(31550) malloc: *** error for object 0x100100084: pointer being freed was not allocated
Run Code Online (Sandbox Code Playgroud)


And*_*ter 5

您唯一可以传递给您的指针是从(or 、等) 或 NULLfree返回的指针。malloccallocrealloc

我猜你问这个问题是因为你有一些执行 malloc 的函数,并且你想弄乱数据块,然后在完成后将其删除,并且你不想费心保留原始指针的副本。事实并非如此。

  • @Lambert,不要摆桌子。只需在对齐的 malloc 实现中向内存块添加一个标头即可。 (2认同)