2

我重载了 new 和 delete 运算符。我想保存指向“旧”的指针new并将delete其称为“新”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),但也很糟糕。

4

1 回答 1

2

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

p = ::operator new( size );

请注意,如果您的展示位置 new 返回的不是::operator new. 否则, delete将无法正常工作。如果您使用任何除返回的指针以外的新位置::operator new,您需要定义一个新的全局operator delete(因为这是将被调用的),这反过来意味着您还必须定义一个新标准 operator new,以便它与您的新 operator delete. 为了避免必须自己实现所有内存管理,请在您的实现中使用mallocfree

于 2011-12-19T10:16:45.200 回答