用c ++多次替换new / delete会发生什么?

问题描述

如果我正确理解,则在链接时会发生全局替换运算符newdeletenew[]delete[]的情况。因此,如果在任何翻译单元中都有替换的新编译内容,它将用于整个已编译的应用程序。由此引起的一些问题:

  1. 这句话正确吗?
  2. 在多个文件中定义了替换项时会发生什么?使用哪个?
  3. 动态链接库中定义的替换会发生什么?
  4. 是否有一种方法可以根据要替换的版本实施替换?

类似:

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

解决方法

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

标准C和C ++库中的分配器函数定义为具有弱链接,并且当链接器找到具有强链接的该名称的符号时,它将与该强符号链接。即库提供的功能的这种覆盖必须由库明确允许;这种机制只有两个层次,即弱层次和强层次。而第二个高强度符号会中断链接。

实现=IMPORTXML(A1,"//a/@href[contains(.,'apple')]") 所要做的就是依靠C分配器。即根据C ::operator new()函数实现C ++ ::operator new()。该功能集具有不同的符号名称,因此当您提供自己的malloc()时仍可访问。 (另一种方法是通过::operator new()与系统内核直接交互,以将整个页面分配给该进程。)


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

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