我想使用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创建测试实例时,没有调用构造函数,但是如果我删除它,则析构函数被调用。为什么?我可以避免吗?
答案 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版本。