【问题标题】:Why does replacing malloc() require knowledge of the linker but ::operator new() does not?为什么替换 malloc() 需要链接器的知识,但 ::operator new() 不需要?
【发布时间】:2014-07-01 19:08:26
【问题描述】:

查看链接的问题。

Difference between global operator new and malloc

接受的答案表明,

“替换 malloc 会带来一大堆蠕虫。它可以做到,但不可移植,因为它需要了解链接器。”

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

【问题讨论】:

  • 如果你只有一个指针,你可以转发声明,但如果你有一个对象的实例,则需要一个完整的包含。 stackoverflow.com/questions/553682/…
  • 链接答案中的声明说 3. new has the concept of a new_handler, for which there is no malloc equivalent. 。恕我直言,这不是 100% 正确的。在underyling c 库中通常声明了几个弱符号,可以用您自己的实现覆盖(参见例如_sbrk)。声明的弱符号不一定涉及链接器知识

标签: c++ linker malloc new-operator


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多