【问题标题】:Operator new and delete overloading scope运算符 new 和 delete 重载范围
【发布时间】:2014-03-26 16:48:35
【问题描述】:

我偶然发现了一些关于 operator new 和 delete 的链接和重载的问题。

operator new/delete 的全局重载在多长时间内生效

  1. 每个翻译单元
  2. 每个链接的应用程序至少有一个目标文件重载这些运算符

动态链接呢?

这些运算符可以有多种定义吗?如果拿哪一个。

【问题讨论】:

    标签: c++ linker operator-overloading new-operator


    【解决方案1】:

    全局分配和解除分配功能适用于整个应用程序,而不是每个翻译单元。因为它们是全局的,所以不能有多个定义,除非您认为newnew[] 和无限数量的可能放置new 是“多个定义”。特别是不幸的是,当您定义自己的全局分配函数时,没有可移植的方式来调用原始全局分配函数。

    但是,您可以定义特定于类的分配和释放函数。

    如果您想避免在new-表达式中使用特定于类的分配函数,您可以使用:: 前缀,即编写::new T,这是调用标准库的位置@ 的好主意987654327@.


    关于“动态链接呢?”目前还不清楚你的意思。 C++有静态链接、外部链接和无链接,但没有动态链接。可能您指的是动态库(如 Windows DLL),这是一个非常棘手的问题。 C++ 标准没有对动态库的直接支持。在实践中安全的一种方法是不提供您自己的全局分配/解除分配,并动态链接所有内容(在 Windows 中,这意味着使用动态链接的运行时库)。

    【讨论】:

    • @cheers-and-hth-alf:如果库是在运行时动态加载的,则不能仅针对该库中存在的对象覆盖全局new。我做对了吗?因为我需要在插件库中重新定义new以进行调试,这似乎是不可能的。
    • @MKroehnert:Windows DLL 很像一个可执行文件(它是相同的文件格式,一个可移植的可执行文件)。因此,DLL 代码不受您在客户端代码中所做的任何覆盖的影响。但是,如果您对 DLL 接口有一定的控制权,则可以使其接受要使用的分配器对象,或者如果您有源代码,则可以重新编译它,并进行覆盖。
    • @cheers-and-hth-alf:就我而言,我必须在 Linux 上处理 .so 文件。问题是这个库中new的覆盖似乎根本没有被使用,尽管它是用代码定义和编译的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2013-03-12
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多