如何正确地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 }