2011-12-19 64 views
2

我已经重载了新的和删除操作符。我想保存指向'旧'newdelete的指针,将其称为'新'newdelete。例如:如何将指针保存到重新定义的运算符?

#include "h.h" 
void * operator new (size_t size, /*args*/) throw (std::bad_alloc) 
{ 
    void * p = 0; 
    p = original_new(size); //calling for 'old' new 
    //some code 
    return p; 
} 

而且类似的操作delete

所以,我想在我的头文件键入如下:

static void * (*original_new)(size_t) = ::operator new; 
static void * (*original_new_arr)(size_t) = ::operator new[]; 
static void (*original_delete)(void *) = ::operator delete; 
static void (*original_delete_arr)(void *) = ::operator delete[]; 

成功编译,但我有在启动核心转储。 有可能致电mallocnew坏它真的是的想法。可以拨打new(std::nothrow),但也不好。

+1

检查此链接在stackoverflow http://stackoverflow.com/questions/583003/overloading-new-delete – Raghuram 2011-12-19 10:09:34

+0

不重载新的和全球删除,以及如何使用malloc和免费? – Yola 2011-12-19 10:12:48

+0

@Yola:定义“全局”。如果重载声明在翻译单元中不可见,则不能使用。 – 2011-12-19 10:54:37

回答

2

您不需要保存指针;定义一个放置新运营商(任何需要多个参数的 operator new函数)不会删除现有的运营商 ;它只是超载它们。要从放置operator new函数调用 标准算新功能:

p = ::operator new(size); 

注意,你不要做到这一点,如果你的位置new返回 什么,但通过::operator new返回的确切地址。否则, delete将不起作用。如果你使用任何安置新返回任何 其他比::operator new返回一个指针,你需要定义一个 新的全球operator delete(因为这是将要 称为一个),这反过来又意味着你必须定义一个新标准 operator new,以便它可以正确使用您的新 operator delete。为了避免必须自己实现所有的内存管理,请在 实现中使用mallocfree

+0

我有内存泄漏的大项目,我不想修改很多代码。现在,如果我在cpp文件中包含h.h“',它会获得一个重新定义的'new'和'delete',如果不包含 - 它使用'old'运算符。 你说得对。但是,似乎不可能将'operator delete(void * p)'重载到'operator delete(void * p,char * file,int line)'。 因此,从'new''delete'调用'old''delete'是无限递归。 – Jury 2011-12-19 11:02:39

+0

替换全局标准new和delete不需要对代码进行任何更改,甚至不需要重新编译;您所要做的就是确保您的新版本位于要链接的文件列表中的标准库之前。关于'delete',如果您定义了新的展示位置,您可以(也应该)定义展示位置删除。但大多数时候,它仍然是被调用的标准删除,所以如果你有一个特殊的新的,你必须提供一个非放置删除以及处理它,如果你定义了一个非放置删除,您还必须定义非放置新的。 – 2011-12-19 13:32:25