C++ 运算符new和delete重载作用域
我偶然发现了一些关于new和delete操作符的链接和重载的问题 运算符new/delete的全局重载在多大程度上生效C++ 运算符new和delete重载作用域,c++,linker,operator-overloading,new-operator,C++,Linker,Operator Overloading,New Operator,我偶然发现了一些关于new和delete操作符的链接和重载的问题 运算符new/delete的全局重载在多大程度上生效 每翻译单位 至少有一个对象文件重载这些运算符的每个链接应用程序 那么动态链接呢 这些运算符可以有多个定义吗?如果选择哪一个。全局分配和取消分配功能适用于整个应用程序,而不是每个翻译单元。因为它们是全局的,除了你认为“代码>新< /代码>,新[] /代码>和无限数量的可能的放置新< /代码>为“多个定义”之外,不可能有多个定义。特别是,不幸的是,当您定义自己的函数时,没有可移植的
这些运算符可以有多个定义吗?如果选择哪一个。全局分配和取消分配功能适用于整个应用程序,而不是每个翻译单元。因为它们是全局的,除了你认为“代码>新< /代码>,<代码>新[] /代码>和无限数量的可能的放置<代码>新< /代码>为“多个定义”之外,不可能有多个定义。特别是,不幸的是,当您定义自己的函数时,没有可移植的方法来调用原始的全局分配函数 但是,您可以定义特定于类的分配和解除分配函数 如果要避免在
新的-表达式中拾取特定于类的分配函数,可以使用:
前缀,即编写::新T
,这是调用标准库的placementnew
的好主意
关于“动态链接呢?”不清楚你的意思。C++具有静态链接、外部链接和无链接,但没有动态链接。可能您指的是动态库(如Windows DLL),这是一个相当棘手的问题。C++标准对动态库没有直接支持。一种在实践中安全的方法是不提供您自己的全局分配/解除分配,并动态链接所有内容(在Windows中,这意味着使用动态链接的运行时库)。@cheers and hth alf:如果在运行时动态加载库,无法仅为此库中存在的对象覆盖全局new
。我做对了吗?因为我需要在插件库中重新定义new
,以便进行调试,这似乎是不可能的。@MKroehnert:Windows DLL很像一个可执行文件(它的文件格式相同,是一个可移植的可执行文件)。因此,DLL代码不受您在客户端代码中所做的任何重写的影响。但是,如果您对DLL接口有一些控制权,那么您可以让它接受要使用的分配器对象,或者如果您有源代码,那么您可以通过重写重新编译它。@cheers and hth alf:在我的情况下,我必须处理一个。因此,Linux上的文件。问题在于,该库中的new
重写似乎根本没有被使用,尽管它是用代码定义和编译的。