我重载了new和delete运算符。我想保存指向“旧”new
和delete
的指针,将其称为“新”new
和delete
。例如:
#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)
,但也不好。
答案 0 :(得分:2)
您不需要保存指针;定义一个新的运营商(任何
operator new
函数,它不止一个参数)
删除现有的运营商;它只会使它们超载。打电话给
标准运算符来自放置运算符新函数的新函数:
p = ::operator new( size );
请注意,如果您的展示位置返回,则不想要执行此操作
除了::operator new
返回的确切地址之外的任何内容。除此以外,
delete
无效。如果您使用任何返回任何内容的新位置
除::operator new
返回的指针外,您需要定义一个
新的全球operator delete
(因为这将是一个
被叫),这反过来意味着你必须定义一个新的标准
operator new
也是如此,以便它可以正常使用您的新功能
operator delete
。为了避免必须实现所有的
自己管理内存,在你的内容中使用malloc
和free
的实施方式。