C++ c++;多次替换“新建/删除”时会发生什么情况?

C++ c++;多次替换“新建/删除”时会发生什么情况?,c++,new-operator,C++,New Operator,如果我理解正确,全局替换操作符new、delete、new[]和delete[]是链接时发生的事情。因此,如果在任何翻译单元中有新编译的替换项,它将用于整个编译的应用程序。由此产生的一些问题: 这句话对吗 如果在多个文件中定义了替换,会发生什么情况?使用哪一种 动态链接库中定义的替换会发生什么情况 是否有办法根据被替换的版本实施替换 比如: void* operator new(std::size_t sz) { ... do something ... return previous_

如果我理解正确,全局替换操作符
new
delete
new[]
delete[]
是链接时发生的事情。因此,如果在任何翻译单元中有新编译的替换项,它将用于整个编译的应用程序。由此产生的一些问题:

  • 这句话对吗
  • 如果在多个文件中定义了替换,会发生什么情况?使用哪一种
  • 动态链接库中定义的替换会发生什么情况
  • 是否有办法根据被替换的版本实施替换
  • 比如:

    void* operator new(std::size_t sz) {
      ... do something ...
      return previous_version_of_new(sz);
    }
    

    如果存在多个同名的强符号,则会出现链接器错误

    标准C和C++库中的分配器函数定义为弱链接,当链接器找到具有强链接的名称的符号时,它将链接到该强符号。也就是说,这种对库提供的函数的重写需要库特别允许;而这一机制只有两个层次,弱层次和强层次。强级别的第二个符号中断链接

    当您实现
    ::operator new()
    时,可以做的是依赖C分配器。即,在C++代码> MalCube()/<代码>函数的基础上实现C++ <代码>::运算符NeW()/CODE。此函数集具有不同的符号名称,因此在您提供自己的
    ::operator new()
    时仍然可以访问。(另一种方法是通过
    mmap()
    直接与系统内核交互,将整个页面分配给进程。)


    您可以使用
    objdump-t
    (弱符号使用
    w
    标志打印)或
    nm
    (确保在共享库上使用
    -D
    标志,如果没有它,则只列出非动态符号)。如果库将
    ::operator new()
    malloc()
    定义为强/普通符号,则将使用该实现


    当然,库不应该将自定义的
    ::operator new()
    malloc()
    定义为强符号,除非它们是专门的分配器库。另一方面,应用程序可以在自定义分配器库中自由链接,或者提供自己版本的
    :operator new()
    malloc()
    ,因为它们是定义完整可用符号集的最终用户。

    。因此,1的答案是肯定的,2-4的答案是错误的吗?当我在预编译库中链接时,是否至少有一种方法可以让我知道它的格式是否错误。调试模式下的VisualC++将“代码> AsjtType()/代码>或崩溃,如果您试图重写全局<代码>新< /Cord>,并且您使用的代码如<代码> STD::vector < /代码>。