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

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

我重载了 new 和 delete 运算符。我想保存指向“旧”newdelete 的指针以将其调用到"new"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) 但它也很糟糕。

最佳答案

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

p = ::operator new( size );

请注意,如果您的展示位置新返回,您不想这样做 除了 ::operator new 返回的确切地址之外的任何内容。否则, delete 将不起作用。如果您使用任何返回任何内容的新展示位置 除了 ::operator new 返回的指针外,您还需要定义一个 新的全局 operator delete(因为这将是 称为),这反过来意味着你必须定义一个新的标准 operator new 也是如此,以便它能与您的新 运算符删除。为了避免必须实现所有的 自己管理内存,在你的代码中使用 mallocfree 实现。

关于c++ - 如何将指针保存到重新定义的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8559690/

相关文章:

c++ - 运行时抛出的 std::regex_error 异常

c - 如何从 C 中的指针获取数组的大小?

c++ - 如果我重载了原始 "operator new",如何调用它?

c# - 以最简单的方式实例化一个对象数组?

java - 工厂内部的 If 语句过多

c++ - 为什么我不能在同一个文件中定义已经前向声明的成员函数?

c++ - 指向数组的指针

c# - 在 C# 中设置对 null 的引用

javascript - 在 JavaScript 中为新添加的元素添加 onclick 事件

c++ - 释放抽象类指针