为什么替换malloc()需要知道链接器但是:: operator new()不需要?

时间:2014-07-01 19:08:26

标签: c++ linker malloc new-operator

参见相关问题。

Difference between global operator new and malloc

接受的答案说明,

“替换malloc会打开一堆蠕虫。它可以完成,但不能移植,因为它需要知道链接器。”

为什么替换malloc需要知道链接器以及为什么不替换:: operator new()?

1 个答案:

答案 0 :(得分:7)

标准C ++规定覆盖::operator new。虽然实现肯定是混乱的和链接器相关的,但C ++程序可以定义不同的::operator new并且它可以工作。 C ++标准明确指出:程序可以用它们自己的定义(等等各种限制和细节)来代替它们。

另一方面,

malloc是在普通库中定义的普通函数,而C(和C ++,就此而言)没有替换像这样的函数的工具。您几乎可以说服太阳下的每个链接器链接到您的libc sans malloc ,并将对malloc的引用解析为来自其他库/目标文件的某些代码。但是你不能只定义不同的malloc函数,因为它违反了一个定义规则:你最终在程序中使用了两个名为“malloc”的函数,这两个函数都被标准禁止(对于非{ {1}},非匿名 - static,非 - namespace,...函数)和链接器的严重问题(很可能会丢失错误或两个定义中的一个)。