2014-07-01 19 views
7

查看链接的问题。为什么更换malloc()需要链接器的知识,但:: operator new()不?

Difference between global operator new and malloc

接受的答案州,

“更换的malloc开辟了一罐蠕虫,它可以做到的,但不可移植性,因为它需要连接的知识。”

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

+0

如果你只有一个指针,你可以转发声明的原因相同,但是如果你有一个对象的实例,则需要一个完整的include。 http://stackoverflow.com/questions/553682/when-can-i-use-a-forward-declaration?rq=1 – CoryKramer

+0

来自链接答案的声明说'3。 new有一个new_handler的概念,对此没有malloc等价物。恕我直言,这不是100%真实的。在underyling c库中通常会声明几个弱符号,可以使用自己的实现_overridden_​​(参见例如['_sbrk'](http://en.wikipedia.org/wiki/Sbrk))。声明的弱符号不一定涉及链接器_的知识点。 –

回答

7

标准C++为重写::operator new做出规定。虽然实现当然是凌乱的,并且与链接器相关,但C++程序可以定义一个不同的::operator new,它可以工作。 C++标准明确指出:程序可以用它们自己的定义(等等等等)来取代这些定义和细节。另一方面是在普通库中定义的普通函数,而C(和C++,就此而言)没有用于替换这样的函数的设施。您几乎可以说服每个太阳下的链接器都链接到您的libcsans malloc,并将对malloc的引用解析为来自另一个库/对象文件的某些代码。但是你不能仅仅定义一个不同的函数,因为它违背了单一定义规则:你在程序中最终有两个叫做“malloc”的函数,这两个函数都被标准禁止(非static,非匿名 - namespace,非inline,...功能)和连接器的一个严重问题(很可能,错误或两个定义中的一个被删除)。

相关问题