c++ - 使用可选参数重载 new 和 delete 运算符

标签 c++ operator-overloading new-operator delete-operator

#include <new>
#include <cstdlib>
#include <iostream>
#include <stdexcept>

struct foo {};

inline void* operator new(size_t size, foo*) throw (std::bad_alloc)
{
    std::cout << "my new " << size << std::endl;
    return malloc(size);
}

inline void operator delete(void* p, foo*) throw()
{
    std::cout << "my delete" << std::endl;
    free(p);
}

int main()
{
    delete new((foo*)NULL) foo;
}

输出(via ideone):

my new 1

我的想法是,C++ 会释放一个带有附加参数的新对象,并匹配删除相同的参数,但我显然是不正确的。

让上面的代码调用我的重载删除的正确方法是什么?

最佳答案

当你使用任何形式的 placement new 时,除了 std::nothrow_t 版本,你需要明确地销毁对象并以你认为合适的任何方式释放它的内存。但是,operator delete() 的重载版本仍然需要存在,因为如果对象的构造抛出异常,就会使用它!在这种情况下,不会返回任何指针,因为会引发异常。因此,在这个分配过程中必须完成内存的清除。

也就是说,您的 main() 应该看起来像这样:

int main()
{
    foo* p = new (static_cast<foo*>(0)) foo;
    p->~foo();
    operator delete(p, static_cast<foo*>(0));
}

关于c++ - 使用可选参数重载 new 和 delete 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503902/

相关文章:

c++ - 指针、数组和新运算符

c++ - 全局新运算符重载

c++ - 如何将 openMP 应用于 C++ 函数以验证数独谜题解决方案的所有行?

C++ = 在数组中分配坐标

swift - 为什么在 Swift 中使用自动生成的框架 header 会出现此错误?

ios - swift 中的后缀递归自定义运算符

时间:2019-03-08 标签:c++customoperatornew

c++ - 将函数指针存储为类中的成员

c++从派生类指针获取基类对象?

c++ - 模板赋值运算符(成员函数)实现的正确语法