【问题标题】:How to save pointer to redefined operator?如何保存指向重新定义的运算符的指针?
【发布时间】:2011-12-19 10:03:40
【问题描述】:

我重载了 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[];

它已成功编译,但我在启动时有核心转储。 可以在new 中调用malloc,这真是糟糕 的想法。可以拨打new(std::nothrow),但也很糟糕。

【问题讨论】:

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


【解决方案1】:

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

p = ::operator new( size );

请注意,如果您的新展示位置返回,您确实想要这样做 除了::operator new 返回的确切地址之外的任何内容。除此以外, delete 不起作用。如果您使用任何返回任何内容的新展示位置 除了::operator new 返回的指针,您还需要定义一个 新的全球operator delete(因为这将是 称为),这反过来意味着您必须定义一个新标准 operator new 也一样,这样它就可以与您的新产品一起正常工作 operator delete。为了避免必须执行所有 自己管理内存,在你的 实现。

【讨论】:

  • 我有一个内存泄漏的大项目,我不想大量修改代码。现在,如果我在 cpp 文件中 inlude "h.h" 获得重新定义的 newdelete,如果我不将t include - it uses 'old' operators. You are right. But, it seems impossible to overload operator delete(void *p)` 改为 operator delete(void *p, char *file, int line)。因此,从“新”delete 调用“旧”delete 是无限递归。
  • 替换全局标准 new 和 delete 不需要对代码进行任何更改,甚至不需要重新编译;您所要做的就是确保您的新版本在要链接的文件列表中的标准库之前。关于delete,如果您定义了一个新的展示位置,您可以(并且应该)定义一个展示位置删除。但是大多数时候,调用的还是标准的delete,所以如果你有一个特殊的new,你还得提供一个non-placement delete来处理,如果你定义了一个non-placement delete,您还必须定义非展示位置 new。
猜你喜欢
  • 1970-01-01
  • 2011-05-09
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多