根据 C++ 文档、
operator new
/等。功能是:
在每个翻译单元中隐式声明[,并且]如果程序中为任何可替换分配函数提供了多个替换,则程序格式错误[...]。
也就是说,如果程序员没有定义自己的
operator new
,那么C++标准库必须提供它。相反,如果他们确实提供了它,那么标准库一定不能。
我理解这种行为,但我不理解的是它在链接器级别是如何工作的。
C++ 标准库是在使用它的程序之前编译的,这是程序员决定是否定义自己的
operator new
。因此,C++ 标准库确实需要在某处推测性地提供 operator new
。但是,当用户的程序链接到标准库时,如果他们did定义了自己的分配函数,那么这将导致多个定义并与上面的文档发生冲突(实际上,您会收到关于重复的链接器错误)符号,谢天谢地)。
相反,如果标准库没有定义了
operator new
,那么用户当然必须这样做,否则对它的任何调用都将导致丢失符号(因此会导致链接器错误) .
至少对于 gcc/clang,您可以使用 __attribute__((weak))
将符号定义为
weak。
对频时如果同时存在展位弱和正常符号,则正常符号优先。因此弱符号可以充当“默认”或“后备”。
标准库可以将
operator new
定义为弱,使用户空间应用程序有机会覆盖它,但如果没有,则使用该库的符号,因此避免未定义的引用和多重定义错误。
相同的机制通常适用于系统调用,在单元测试期间进行模拟非常方便。