我可以在重载删除之前阻止调用析构函数吗?

时间:2009-09-08 09:55:18

标签: c++ memory-management

我想使用boost.pool。如果你不知道它也没关系。基本上,它有两个主要功能,malloc()和free()。​​

我为自定义的类测试重载了new和delete。

class test
{
public:

    test()
    {
        cout    << "ctor" << endl;
    }

    ~test()
    {
        cout    << "dtor" << endl;
    }

    void*   operator new(size_t) throw()
    {
        cout    << "custom operator new" << endl;
        return _pool.malloc();
    }

    void    operator delete(void* p)
    {
        cout    << "custom operator delete" << endl;
        _pool.free(p);
    }

    void    show()
    {
        cout    << _i << endl;
    }

private:
    int _i;
    static boost::pool<>    _pool;
};// class test

boost::pool<>   test::_pool(sizeof(test));

当我使用new创建测试实例时,没有调用构造函数,但是如果我删除它,则析构函数调用。为什么?我可以避免吗?

2 个答案:

答案 0 :(得分:1)

添加时无法重现

#include <iostream>
#include <boost/pool/pool.hpp>
using namespace std;

(为什么人们会省略使代码编译所必需的东西?!)和

int main()
{
    test* p = new test;
    delete p;
}

这是一个精简版和修改版,没有这种行为,或者你的编译器可能坏了(它的版本是什么?)

无论如何,你的目标应该是获取名为的构造函数,而不是让析构函数不被调用。重载的operator new只处理原始内存分配,内置的new-expression应该使用它来获取内存,然后调用构造函数在那里创建一个实例。

编辑:我可以重现输出的唯一方法是绕过内置的new-expression:

test* p = static_cast<test*>(test::operator new(sizeof (test)));

答案 1 :(得分:0)

可能是因为全局运营商new被调用了吗?无论如何,只是关于你的班级的评论...

operator new和operator delete始终是 static (即使你没有写关键字),所以在声明中使用 static 是个好习惯。

你用throw()声明了operator new,这意味着它不会抛出。但你使用一个可以抛出的声明(iostreaming)。也许你应该用try / catch包围它并创建一个std::nothrow_t版本。