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