读书人

关于C++的placement new,该如何解决

发布时间: 2012-03-29 12:53:13 作者: rapoo

关于C++的placement new
上代码了,问题是如何调用自己定义的delete:

C/C++ code
#include <iostream>using namespace std;class B{public:  B(){cout << "ctor B" << endl;}  ~B(){cout << "dtor B" << endl;}  void * operator new(size_t size, ostream& out){    out << "new B" << endl;    return ::operator new(size);  }  void operator delete(void *mem, ostream& out){    out << "delete B" << endl;    ::operator delete(mem);  }};int main(){  B *pb = new (cout)B;  B *pb2 = ::new B;  //delete pb;   这句编译不通过,说no suitable ‘operator delete’ for ‘B’  ::delete pb2;}


目前输出是:
new B
ctor B
ctor B
dtor B

期望输出是:
new B
ctor B
ctor B
delete B
dtor B
dtor B

[解决办法]
先说声楼主最好还是把new,delete声明称static好些

把出错的行改成如下
B::operator delete(pb,cout);
即可调用到placement delete了,但是想法和楼主的有差距,这函数里面直接释放内存,就不会再析构了
貌似这个delete是不能通过delete关键字在外面调用的,这个一般都是给系统在placement new出错时调用
而且只要有使用placement new,析构一般都是要手动进行的

[解决办法]
c++为什么没有内置的"placement new"是因为 没办法提供一个通用的。
B *pb = new (cout)B;当我们写出这样的代码的时候,c++不能推出pb指针里面存放的对象类型。(虽然我们知道是什么类型)。所以不会有placement delete.只有在placement new抛出异常的时候,编译器才会调用placement delete.这个时候因为构造不成功所以只需要负责释放内存即可。所以LZ只能是先显示调用析构函数,然后在显示调用placement delete.

另外:不要重载operator new operator delete这些东西。

读书人网 >C++

热点推荐