Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 运算符new和delete重载作用域_C++_Linker_Operator Overloading_New Operator - Fatal编程技术网

C++ 运算符new和delete重载作用域

C++ 运算符new和delete重载作用域,c++,linker,operator-overloading,new-operator,C++,Linker,Operator Overloading,New Operator,我偶然发现了一些关于new和delete操作符的链接和重载的问题 运算符new/delete的全局重载在多大程度上生效 每翻译单位 至少有一个对象文件重载这些运算符的每个链接应用程序 那么动态链接呢 这些运算符可以有多个定义吗?如果选择哪一个。全局分配和取消分配功能适用于整个应用程序,而不是每个翻译单元。因为它们是全局的,除了你认为“代码>新< /代码>,新[] /代码>和无限数量的可能的放置新< /代码>为“多个定义”之外,不可能有多个定义。特别是,不幸的是,当您定义自己的函数时,没有可移植的

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

运算符new/delete的全局重载在多大程度上生效

  • 每翻译单位
  • 至少有一个对象文件重载这些运算符的每个链接应用程序
  • 那么动态链接呢


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

    全局分配和取消分配功能适用于整个应用程序,而不是每个翻译单元。因为它们是全局的,除了你认为“代码>新< /代码>,<代码>新[] /代码>和无限数量的可能的放置<代码>新< /代码>为“多个定义”之外,不可能有多个定义。特别是,不幸的是,当您定义自己的函数时,没有可移植的方法来调用原始的全局分配函数

    但是,您可以定义特定于类的分配和解除分配函数

    如果要避免在
    新的
    -表达式中拾取特定于类的分配函数,可以使用
    前缀,即编写
    ::新T
    ,这是调用标准库的placement
    new
    的好主意



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

    @cheers and hth alf:如果在运行时动态加载库,无法仅为此库中存在的对象覆盖全局
    new
    。我做对了吗?因为我需要在插件库中重新定义
    new
    ,以便进行调试,这似乎是不可能的。@MKroehnert:Windows DLL很像一个可执行文件(它的文件格式相同,是一个可移植的可执行文件)。因此,DLL代码不受您在客户端代码中所做的任何重写的影响。但是,如果您对DLL接口有一些控制权,那么您可以让它接受要使用的分配器对象,或者如果您有源代码,那么您可以通过重写重新编译它。@cheers and hth alf:在我的情况下,我必须处理一个
    。因此,Linux上的
    文件。问题在于,该库中的
    new
    重写似乎根本没有被使用,尽管它是用代码定义和编译的。