- 论坛徽章:
- 0
|
10可用积分
有下面这个程序,是做的new运算符的重载,去生成一个对象,源代码
-------------------------------------------------------------------------------
class c{
int x;
public:
explicit c(int ix){x=ix;printf("ctor\n");}
~c(){printf("dtor\n");}
};
int main(void){
try{
char mem[sizeof(c)*2];
c* pc1=new(mem) c(2);
c c3(4); //加上这句以后,delete pc1就是非法退出, 不加这句就没事...........................................
delete pc1;//不能去delete内存池中的东西,否则出错 ????????
//pc1->~c();//用显示调用析构函数而不用delete总是安全的。
}catch(...){
printf("get exception\n");
}
return 0;
}
------------------------------------------------------------------------------------------------
在没有c c3(4)这个局部对象的时候
delete pc1没有问题。但是我添加了c c3(4)以后delete就有问题了
在某些环境里面(mingwin gcc3.4.2)后面的delete会导致程序崩溃,try和catch都无法捕捉到
如果把delete pc1改成pc1->~c()显示调用析构函数,程序就没有问题。
我的问题是:
(1)replacement new重载,是不是不能调用delete去删除?(因为mem在栈上而不是堆上?) 但是我没有声明c c3(4)的时候delete就没有问题呀。
(2)solaris下运行这个程序就没有问题,又怎么解释呢?
[ 本帖最后由 jeanlove 于 2009-2-4 13:11 编辑 ] |
最佳答案
查看完整内容
c* pc1=new(mem) c(2);delete pc1;//不能去delete内存池中的东西,否则出错 ????????这种方式就是错误的,因为你用的是new的放置语法,而放置语法要求显式的调用析构函数,同时不用的内存需要自己释放时可以free掉,但是在堆栈上的好像不用我们自己费心了吧。更多详细资料请看《C++程序设计语言(特别版)》[ 本帖最后由 flyingtime 于 2009-2-4 13:46 编辑 ]
|