c++ primer关于定位new表达式
p347 8.4.5节(电力出版社):
定位new表达式的问题举例:
class A
{
public:
A(){cout << "a init" <<endl;}
~A(){cout << "a destory" << endl;}
};
void fun()
{
char *Buf = new char[200];
A *pa = new(Buf) A;
delete *Buf;
}
提问:
书中称对不存在与定位表达式相匹配的delete表达式,
那么也就不需要delete pa所指向的对象了。但是问题来了:
当我new一个A对象的时候,构造函数是调用了的,但是,无论
是我退出函数还是delete *buf,都不会调用析构函数。
在这个例子里面还没有问题,可是,如果我在在构造函数中又
创建了新的对象,那就麻烦了:不可避免的会出现内存泄漏。
那么是不是我可以使用delete pa了呢?(我的经验是一般这样肯定
会出问题的)如果不能,有没有什么好的解决方法?还是只能采用
在A中增加一个Release方法这样丑陋的方法呢?
问题点数:100、回复次数:9Top
1 楼anrxhzh(百宝箱)回复于 2002-08-15 17:55:07 得分 15
void fun()
{
char *Buf = new char[200];
A *pa = new(Buf) A;
pa->~A();
delete *Buf;
}
Top
2 楼cwanter(亚玛逊河上的渔夫)回复于 2002-08-15 17:55:58 得分 15
首先提出一点:delete *Buf是不是应为delete [] Buf?
"退出函数还是delete []buf,都不会调用析构函数",退出函数不会调用析构函数,调用delete []buf会调用析构函数。Top
3 楼anrxhzh(百宝箱)回复于 2002-08-15 17:58:07 得分 0
void fun()
{
char *Buf = new char[200];
A *pa = new(Buf) A;
pa->~A();
delete[] Buf;
}
Top
4 楼anrxhzh(百宝箱)回复于 2002-08-15 17:59:15 得分 0
http://www.research.att.com/~bs/bs_faq2.html#placement-deleteTop
5 楼Tommy()回复于 2002-08-15 21:18:41 得分 50
同意楼上,可以直接调用析构函数。在C++ Primer后面的章节中也有提到这个问题,而且在15.8.2,P631对placement new和delete进行了更多的讨论,提出还是可以定义一个与placement new对应的delete,在处理异常时使用。
我觉得C++ Primer最不好的一点就是相关的内容分布在不同的地方,经常提到一个概念,然后说在后面会提到。faint~~~ 还是The C++ Program Language好,在placement new时就说清楚了析构的方法。Top
6 楼wingfiring(非典型秃子)回复于 2002-08-16 10:33:49 得分 0
前面的是我写错了,应该是delete []buf.
不过,显式的调用析构函数让我觉得代码很难看。
怎样做才是最优雅的呢?
================================================================
Top
7 楼Tommy()回复于 2002-08-16 14:27:12 得分 0
如果类中所有对象都是用placement new的话,重载类的operator new和delete,在其中做placement new和释放工作。使用类的人将不必处理这些细节。
Top
8 楼blwyw(半桶水)回复于 2002-08-16 17:28:10 得分 10
placement operator delete用法:
A::operator delete( Buf, pa );Top




