C++中析构函数没有被执行?

gaoyuanfeng 2009-03-07 09:00:57
请大家看下这段代码:
#include<iostream>
using namespace std;

class Student
{
public:
Student()
{
cout<<"constructing student."<<endl;
semesHours=100;
gpa=3.5;
}
~Student()
{
cout<<"destructing student."<<endl;
}
protected:
int semesHours;
float gpa;
};

class Teacher
{
public:
Teacher()
{
cout<<"constructing teacher."<<endl;
}
~Teacher()
{
cout<<"destructing teacher."<<endl;
}
};

class TutorPair
{
public:
TutorPair()
{
cout<<"constructing tutorPair."<<endl;
noMeetings=0;
}
~TutorPair()
{
cout<<"destructing tutorpair."<<endl;
}
protected:
Student student;
Teacher teacher;
int noMeetings;
};

int main()
{
TutorPair tp;
cout<<"back in main."<<endl;
while(1);
return 0;
}
我在VS2005中运行的结果是:
constructing student.
constructing teacher.
constructing tutorPair.
back in main.
为什么析构函数没有被执行呢?
...全文
367 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylx1982 2009-03-08
  • 打赏
  • 举报
回复
在main中仅有一条语句TutorPair tp;这样我试过,还是不行,不会调用析构函数,因为析构函数要在main结束之后再调用,而在我们看到控制台输出时main就结束了,所以看不到被调用的析构函数了……


应该是在main 结束之前吧,哈哈,你可以弄个断点单步执行看看先后嘛 ...
哈哈
gaomingok 2009-03-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 gaoyuanfeng 的回复:]
在main中仅有一条语句TutorPair tp;这样我试过,还是不行,不会调用析构函数,因为析构函数要在main结束之后再调用,而在我们看到控制台输出时main就结束了,所以看不到被调用的析构函数了……
[/Quote]
windows下,可以先运行cmd,然后运行你的程序就可以看见输出了
gaoyuanfeng 2009-03-07
  • 打赏
  • 举报
回复
在main中仅有一条语句TutorPair tp;这样我试过,还是不行,不会调用析构函数,因为析构函数要在main结束之后再调用,而在我们看到控制台输出时main就结束了,所以看不到被调用的析构函数了……
lingyin55 2009-03-07
  • 打赏
  • 举报
回复
while(1); 让程序进入死循环了。
wangqiang8848 2009-03-07
  • 打赏
  • 举报
回复
在我看来,假如main程序中仅有一条语句 TutorPair tp; 也可以调用析构函数。程序运行结束析构函数一定用自动调用的。学识浅薄,请大家多多指教
wangqiang8848 2009-03-07
  • 打赏
  • 举报
回复
我用DEV-C++编写程序,怎么改也不能运行。大家能不能再讨论一下
  • 打赏
  • 举报
回复
int main()
{
TutorPair tp;
cout < <"back in main." < <endl;
while(1);
return 0;
}
你不退出这些数据的作用域,就不会析构这些类实例.所以要去掉while(1).
gaoyuanfeng 2009-03-07
  • 打赏
  • 举报
回复
呵呵,谢谢大家的热心帮助哦,我以前一直用while(1),没注意到这些问题,现在我应该完全懂了这个问题了!谢谢大家哈!O(∩_∩)O~
fairchild811 2009-03-07
  • 打赏
  • 举报
回复
恩。对象的lifetime的问题
ylx1982 2009-03-07
  • 打赏
  • 举报
回复
呵呵,楼主问这个问题没有什么意思。。
析构函数会执行的,只是程序有点问题。。
int main()
{
{
TutorPair tp;
}
cout < <"back in main." < <endl;
while(1);
return 0;
}
应该是可以的
arong1234 2009-03-07
  • 打赏
  • 举报
回复
你原来程序只要程序停在那,你就永远看不倒结果,因为所有对象析构都是你程序得main结束才开始得
要看到结果,你得在命令行方式下执行它,而不是F5执行

[Quote=引用 10 楼 gaoyuanfeng 的回复:]
我试过了,去掉while(1)仍然不能执行析构函数,所以我觉得如楼上所说,while(1)只是为了让控制台停在那,可以看到运行结果。
int main()
{
{
TutorPair tp;
}
cout < <"back in main." < <endl;
while(1);
return 0;
}
这样可以显示析构函数的结果,我认为是加了一个花括号之后,对象tp就是一个局部变量了,这样退出花括号后,对象tp就被析构了。大家觉得是这样吗?
[/Quote]
gaoyuanfeng 2009-03-07
  • 打赏
  • 举报
回复
我试过了,去掉while(1)仍然不能执行析构函数,所以我觉得如楼上所说,while(1)只是为了让控制台停在那,可以看到运行结果。
int main()
{
{
TutorPair tp;
}
cout < <"back in main." < <endl;
while(1);
return 0;
}
这样可以显示析构函数的结果,我认为是加了一个花括号之后,对象tp就是一个局部变量了,这样退出花括号后,对象tp就被析构了。大家觉得是这样吗?

owldestiny 2009-03-07
  • 打赏
  • 举报
回复
lz加了while是为了让控制台停在那,不至于看不到程序执行的结果吧
把while(1)去掉,换成system("pause");
Qlaiaqu 2009-03-07
  • 打赏
  • 举报
回复
。。。循环米有终止
gaomingok 2009-03-07
  • 打赏
  • 举报
回复

int main()
{
{
TutorPair tp;
}
cout < <"back in main." < <endl;
while(1);
return 0;
}

这样试试
sc_valentine21 2009-03-07
  • 打赏
  • 举报
回复
函数一直在循环......
ysysbaobei 2009-03-07
  • 打赏
  • 举报
回复
lightnut 2009-03-07
  • 打赏
  • 举报
回复
去掉 while(1);
BuleRiver 2009-03-07
  • 打赏
  • 举报
回复
这个对象的析构,要等到程序运行到main函数的最后一个}处才执行
while(1);
程序进入死循环,永远运行不到那里,所以永远不析构

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧