为什么替换malloc()需要了解链接器,而::operator new()不需要



参见链接问题

全局操作符new和malloc的区别

被接受的答案是,

"替换malloc打开了一罐蠕虫。这是可以做到的,但不是可移植的,因为它需要了解链接器。"

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

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

另一方面,

malloc是在普通库中定义的普通函数,C(以及c++)没有替换这样的函数的功能。您几乎可以说服太阳下的每个链接器链接到您的libc malloc ,并将对malloc的引用解析为来自另一个库/对象文件的一些代码。但是你不能仅仅定义一个不同的malloc函数,因为这违反了单定义规则:你最终会在程序中得到两个称为"malloc"的函数,这两个函数都是被标准禁止的(对于非static,非匿名- namespace,非inline,…函数)和链接器的严重问题(很可能是一个错误或两个定义中的一个被删除)。

最新更新