为什么 malloc(0) 在"Inside the C++ Object Model?"中有用
Why is malloc(0) useful in "Inside the C++ Object Model?"
在"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
获得一致和跨平台兼容的行为,一切都基本上取决于内核。
- 当覆盖存在时调用基本虚拟"binded to object"函数
- "Unable to start debugging. No process is associated with this object." - 在Visual Studio Code中使用GDB
- C++将派生类转换为基类时'object slicing'期间发生的情况
- 如何理解 C++17 标准参考中的 [intro.object]/3? N4659 的
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- C++线程"Call to non-static member function without an object argument"
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 当两个成员位于同一类中时出错"a nonstatic member reference must be relative to a specific object"
- Nan::ObjectWrap to Napi::Object Wrap 无法访问 JavaScript 中的属性
- 现代C++会支持 C# "Object Initalizer"语法吗?
- 指向对象生存期之外的已分配内存的指针是"invalid pointer[s]"还是"pointer[s] to an object"?
- C++ Equivalent of Java Map<String, Object>
- WebKit2GTK+ "window-object-cleared"未清除
- 返回 *&object 时是否允许复制/移动省略?
- QPointer::clear() 是删除其引用的指针,还是"Clears this QPointer object."其他含义?
- 解决方法:'can not be used when making a shared object; recompile with -fPIC'使用Cmake。使用普通的 g++ 工作
- 根据标准,究竟什么是"declaration of an object"
- 将unique_ptr作为<Object>unique_ptr<常量对象返回>