在"Inside the C++ Object Model"一书的第6.3节中,临时对象(第230页):
实际结果取决于如何实现 底层删除运算符实际上是在释放 内存已寻址。一些实现,同时将内存标记为 免费,实际上不要以任何方式更改它。直到认领内存 通过其他内容,它可以像没有被删除一样使用。而 显然不是软件工程的典范方法,这 在释放内存后访问内存的习语并不少见。
malloc()
的许多实现,其实都提供了一个特殊的 调用malloc(0);
来保证此行为。
根据上述内容,malloc(0)
似乎与访问已释放的内存(但内容未更改)有关。
我的问题是malloc(0)
如何保证这种行为?
编辑:我没有注意到"在C++对象模型内部"是一个参考,而不仅仅是问题标题的一部分。
正如Dietmar Kuhl所说,它看起来像一个笨蛋,即使它出现在你的平台上,你也不应该依赖这样的扩展。
"大多数平台">确实包括某种malloc
调试工具,以帮助程序员找到访问已传递给free
的内存的代码。这可能涉及不太懒惰地执行内存管理或使用特殊字节模式覆盖。听起来该文本将malloc(0)
描述为禁用此类设施的一种手段。在Mac OS X上,我记得有一个环境变量(类似于MALLOC_DEBUG
)来控制它。设施的功能和启用方式因平台而异。覆盖malloc(0)
既不常见,也不是一个好的界面。
编辑:我在Stanley Lippman的Inside the C++对象模型中找到了它,1996年。不是权威来源。整个页面似乎都致力于讨论标准和"预标准"平台实现之间的差异,尽管1996年也是在第一个标准完成之前。请注意,这是很久很久以前的计算机时代,除非您将特定的应用程序从死里复活,否则这些信息将完全无关紧要。Lippman显然在C++11上发布了一本新书,其中包括一个支持多线程的更新对象模型。(虽然我不知道他或那本书是否有任何好处。
从引文中似乎有一些malloc()
的实现使用malloc(0)
作为某种开关来指示将来对malloc()
分配内存的调用,free()
(可能realloc(p, 0)
)在将其标记为未使用时不会更改分配内存的内容。显然,这是一个标准的符合标准的扩展,您最好不要依赖它。
从实际的角度来看,malloc
甚至不能给予一些空间来真正分配。
查看malloc
如何运行的最有效方法是将其视为对内核的请求,内核可以说"ok"或"no",但如果内核说"ok",你根本无法确定它是否真的为你分配了内存,或者它只是说"ok"让你开心。
这是一种关于内存页面的超额预订,这是 Linux 下的常见问题,例如,通常 linux 内核对malloc
请求非常宽容,但即使您的malloc
请求返回正结果,也可能发生内存不足的情况。
如果你想要一个主题搜索"Linux 内存过度提交"的名称,并且你会大致了解malloc
如何在 Linux 下工作,类似的概念也适用于其他平台,这意味着你永远不会从malloc
获得一致和跨平台兼容的行为,一切都基本上取决于内核。