c++ - 为什么替换 malloc() 需要链接器的知识,而::operator new() 不需要?

标签 c++ linker malloc new-operator

查看链接的问题。

Difference between global operator new and malloc

接受的答案指出,

“替换 malloc 会引发大量蠕虫。它可以做到,但不可移植,因为它需要链接器的知识。”

为什么替换 malloc 需要链接器的知识,为什么替换::operator new() 不需要?

最佳答案

标准 C++ 对覆盖 ::operator new 做出了规定。虽然实现肯定是困惑的并且与链接器相关,但 C++ 程序可以只定义一个不同的 ::operator new 并且它可以工作。 C++ 标准明确表示:程序可以用自己的定义替换这些(等等各种限制和细节)。

另一方面,

malloc 是在普通库中定义的普通函数,而 C(和 C++,就此而言)没有替换此类函数的工具。您几乎可以说服世界上所有的链接器链接到您的 libc sans malloc 并将对 malloc 的引用解析为来自另一个库/目标文件的一些代码。但是你不能只定义不同的 malloc 函数,因为这违反了一个定义规则:你最终在程序中得到两个名为“malloc”的函数,这两个函数都是标准禁止的(对于非static,非匿名-namespace,非inline,...函数)和链接器的严重问题(很可能,错误或两个定义之一被删除)。

关于c++ - 为什么替换 malloc() 需要链接器的知识,而::operator new() 不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24517582/

相关文章:

c - 取消引用 void 指针数组

cuda - CUDA中Malloc函数的效率

c - 释放包含动态缓冲区的动态缓冲区中的内存

c++ - VS2015 的多处理器编译在运行 cl.exe 时产生 "not enough quota is available to process this command"

assembly - ld with -Ttext=0x1000 使文件非常大

c++ - 在 bool 值上重载模板类的成员

c++ - 命令输入文件如何影响 GCC 中的链接和静态初始化?

c - 可疑的静态链接可执行文件大小

c++ - std::merge 不适用于 std::async

c++ - LNK1104 尝试与 boost_filesystem*.lib 链接时