【发布时间】:2017-05-20 03:22:08
【问题描述】:
class Foo{
public:
Foo(){
cout <<"C ";
}
~Foo(){
cout <<"D ";
}
};
void func(){
Foo* p = new Foo;
p = NULL;
}
int main(){
Foo a;
for (int i=0; i<1; i++){
Foo b;
if (true){
Foo c;
}
func();
}
return 0;
}
对于这个问题,输出是C C C D C D D,如果我删除main函数中的func(),输出就变成了C C C D D D,我明白它来自哪里的前3个C,但是我不明白剩下的,请解释一下,谢谢。
【问题讨论】:
-
for (int i=0; i<1; i++)基本上只执行一次它的块,if(true)也是如此。如果要定义范围,只需使用一对大括号 ({ })。你不需要在流控制语句的上下文中使用它们,你可以简单地做int main(){ Foo a; { Foo b; { Foo c; } func(); } return 0; } -
使用调试器逐步完成可能会有所帮助...
-
p = NULL;实际上并没有销毁对象。new Foo对象被泄露。此行应为delete p;。 -
您似乎对析构函数的作用以及对象生命周期的工作方式感到困惑。这对于 c++ 来说是非常基础的东西,最好由 good book 覆盖。
-
如果您要添加一些调试消息,您会注意到按退出范围的顺序,ctor 用于 abcp,dtor 用于 cba。 P 泄漏。
标签: c++ constructor destructor