如何正确地replace全局新增和删除操作符
首先,在SO上至less有4-5个话题有类似的话题。 我读了他们每个人,我不觉得他们真的帮助我解决这个具体问题。 如果有人发现重复的问题,我表示歉意。 在发布之前,我已经完成了我的search工作,因为这似乎是一个很常见的问题。
我在Windows 7上使用Visual Studio .NET 2003。
我有我自己的重载新/删除指向我自己的自定义调用malloc()和free()进行诊断。 我的新/删除重载是在一个头文件,我已经包含在几个文件。
问题是,代码基础是非常意大利面条,并没有简单的方法来确保这些重载被一切使用。 第三方库包含黑箱。 我们也到处使用STL。
在我的testing中,我发现STL仍然将呼叫混合到我自己的新/删除和标准的MSVC新/删除呼叫中。
将我的头文件包含在成千上万的其他文件中似乎并不现实,这只需要很长时间。 任何人都可以提供一些关于如何适当和有效地重载全局新/
这不是如何工作。 您replace两个操作员,这是在链接时完成的。 所有你需要做的就是编写一个单一的TU来定义这些操作符,并将它们连接起来。 没有人需要知道这个:
// optional_ops.cpp void * operator new(std::size_t n) throw(std::bad_alloc) { //... } void operator delete(void * p) throw() { //... }
不需要任何头文件,因为这两个函数的声明已经被硬编码到了语言中,如果你愿意的话。
另外添加这些行:
void *operator new[](std::size_t s) throw(std::bad_alloc) { // TODO: implement return NULL; } void operator delete[](void *p) throw() { // TODO: implement }