【发布时间】:2010-01-20 19:54:38
【问题描述】:
我想替换全局的operator new() 和operator delete()(以及它们的所有变体)来做一些内存管理技巧。我希望我的应用程序中的所有代码都使用自定义运算符(包括我自己的 DLL 和第三方 DLL 中的代码)。我已经阅读了链接器将选择链接时看到的第一个定义的内容(例如,如果首先链接包含您的自定义 operator new() 的库,它将“击败”与 CRT 的链接)。有没有办法保证这会发生?这有什么规则,因为这确实是一个多重定义的符号(例如,void* operator new(size_t size) 在全局命名空间中有两个定义)?
可能与 CRT 静态链接的第三方 DLL 怎么样?即使它们与 CRT 动态链接,是否有某种方法可以让它们与 my operator new() 链接?
【问题讨论】:
-
这充满了危险。您确定要执行此操作(y/N)吗? >
-
DLL 是二进制文件,因此在您获取它们时它们已经被编译和链接。
-
很公平。我之所以问,是因为如果您的下一个 StackOverflow 问题是“如何在非常重要的生产系统上恢复数据?”,我会感到难过。 ;)
-
在类 Unix 平台上这通常是可能的,但 Window 的动态库模型不同。在 Unix 上,加载时链接通常符合 C++ 翻译阶段第 9 阶段的 C++ 要求,其中包括链接替换
operator new和operator delete。 Windows 的加载时链接实现不符合第 9 阶段,通常无法替换。
标签: c++ memory-management linker