在“C++对象模型内部”一书的第6.3节中,临时对象(第230页):
实际结果取决于底层delete操作符在实际释放所寻址的内存中的侵略性程度。某些实现虽然将内存标记为空闲,但实际上不会以任何方式更改它。在内存被其他东西占用之前,它可以像没有被删除一样使用。虽然显然不是一种软件工程的典范性方法,但这种在释放内存之后访问内存的习语并不少见。实际上,
malloc()**,的许多实现都提供了一种特殊的调用**malloc(0);来保证这种行为。
根据以上所述,malloc(0)似乎与访问已被释放的内存有关(但其内容未被更改)。
我的问题是malloc(0)如何保证这种行为?
发布于 2012-12-25 03:50:07
从引号中可以看出,malloc()的一些实现使用malloc(0)作为某种切换,以指示将来对malloc()的调用分配内存时,free() (可能还有realloc(p, 0))不会更改分配内存的内容,而将其标记为未使用。显然,这是一个符合标准的扩展,您最好不要依赖它。
发布于 2012-12-25 06:24:27
编辑:我没有注意到“C++对象模型内部”是一个引用,而不仅仅是问题标题的一部分。
正如Dietmar说的,它看起来像一个传说,你不应该依赖这样的扩展,即使它出现在你的平台上。
“大多数平台”确实包括某种malloc调试工具,以帮助程序员找到访问已传递给free的内存的代码。这可能包括不那么懒惰地执行内存管理,或者用特殊的字节模式覆盖。听起来,该文本将malloc(0)描述为禁用此类设施的一种手段。在Mac上,我记得有一个环境变量(类似于MALLOC_DEBUG)控制这一点。该设施的功能和启用方式在不同平台之间会有很大差异。覆盖malloc(0)既不常见,也不是一个好的接口。
编辑:我在http://www.joomag.com/magazine/Inside_the_C___Object_Model/35761/p134中找到了它,斯坦利普曼,1996年。不是权威来源。整个页面似乎专门讨论标准和“预标准”平台实现之间的差异,尽管1996年也是在第一个标准完成之前。请注意,这是很久很久以前的计算机年代,除非你带来一个特定的应用程序从死后,这些信息将是完全无关的。利普曼显然发布了一本关于C++11的新书,其中包括一个更新的具有多线程支持的对象模型。(虽然我不知道他或那本书是否好。)
发布于 2012-12-25 03:40:21
从实际角度来看,malloc甚至不能给出一些空间来进行真正的分配。
查看malloc是如何运行的最有效的方法是将它看作是对内核的请求,内核可以说"ok“或"no",但是如果内核说"ok”,您就不能确定它是否真的为您分配内存,或者它只是说"ok“来让您高兴。
这是一种对内存页面的超额预订,例如,在linux下这是一个常见的问题,通常linux内核对malloc请求非常宽容,但是即使您的malloc请求返回一个肯定的结果,也可能会出现内存不足的情况。
如果您想要一个主题搜索"Linux内存过度提交“的名称,并且您将大致了解malloc在Linux下是如何工作的,那么类似的概念适用于其他平台,这意味着您将永远无法从malloc获得一致和跨平台兼容的行为,并且一切基本上取决于内核。
https://stackoverflow.com/questions/14027448
复制相似问题