[英]c++ what happens when new/delete is replaced multiple times?
如果我理解正确的话,操作符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 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.