如何将指针保存到重新定义的运算符?

时间:2011-12-19 10:03:41

标签: c++ memory-management new-operator redefinition

我重载了new和delete运算符。我想保存指向“旧”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[];

它已成功编译,但我在启动时有核心转储。 可以在malloc中致电new,这是非常糟糕的想法。可以拨打new(std::nothrow),但也不好。

1 个答案:

答案 0 :(得分:2)

您不需要保存指针;定义一个新的运营商(任何 operator new函数,它不止一个参数) 删除现有的运营商;它只会使它们超载。打电话给 标准运算符来自放置运算符新函数的新函数:

p = ::operator new( size );

请注意,如果您的展示位置返回,则想要执行此操作 除了::operator new返回的确切地址之外的任何内容。除此以外, delete无效。如果您使用任何返回任何内容的新位置 除::operator new返回的指针外,您需要定义一个 新的全球operator delete(因为这将是一个 被叫),这反过来意味着你必须定义一个新的标准 operator new也是如此,以便它可以正常使用您的新功能 operator delete。为了避免必须实现所有的 自己管理内存,在你的内容中使用mallocfree 的实施方式。