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 < /代码>。