繁体   English   中英

c++ 当new/delete被多次替换时会发生什么?

[英]c++ what happens when new/delete is replaced multiple times?

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

  1. 这个说法正确吗?
  2. 当在多个文件中定义替换时会发生什么? 使用哪一种?
  3. 动态链接库中定义的替换会发生什么?
  4. 有没有办法根据被替换的版本来实现替换?

就像是:

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

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

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

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


您可以使用objdump -t (弱符号用w标志打印)或nm (确保在共享库上使用-D标志,没有它,只列出非动态符号)来查看符号的类型。 如果库将::operator new()malloc()定义为强/正常符号,则这就是将要使用的实现。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM