历程被强制杀死,析构函数没有运行
进程被强制杀死,析构函数没有运行?
写了一个控制台程序,在一个类的析构函数中,把数据刷新到磁盘文件中。我没有主动调用delete,而是程序结束时,系统清理类对象时,自动调用析构函数。
本来运行的好好的。很正常。可在二逼的舍友电脑上就不正常了。他说磁盘中文件中的数据更本没有刷新,老是0。我看他运行的时候,不是让程序正常结束,而是点控制台右上角的X,强制关闭。我猜想是析构函数没有运行。我让他正常结束程序后,就正常了。
我今天又写了一个测试程序,看看程序被强制退出时,析构函数会不会运行。
在控制台中,按ctrl-c结束进程,可以看到析构函数运行了。

为什么点右上方的X按钮,析构函数就不会运行呢?
怎样才能避免这种隐患?
析构函数没有运行会造成内存泄露吗?
------解决方案--------------------
你写一个死循环,点X之后程序也结束了。也就是说X是直接中断程序的。
析构函数没执行很正常。
系统会将进程申请的资源(全局资源除外)都释放掉。
------解决方案--------------------
直接打关掉又没事,当程序结束时,不管是堆或是栈都会被释放掉,有没有析构都无所谓了!
正常情况下,代码运行结束,程序并没有真正的结束,
还会调一下对象析构函数,和一些如atexit等函数.
------解决方案--------------------
及时刷新到硬盘才是正事.
------解决方案--------------------
Ctrl-C是给进程发了一个信号量 这个信号量导致cin.get()返回了 然后是main函数返回 触发A的析构
你X掉程序是相当于给程序发了一个的信号 相当于程序直接exit退出 也就是cin.get()根本没返回就退出了 肯定不会触发析构
你要X掉的时候捕捉到析构
就捕捉X掉时触发的这个信号或事件 然后在其中实现A的释放
------解决方案--------------------
强制终止程序,析构是没有机会执行的,就好像,你执行一个图形界面程序,一在任务管理器中让他强行终止,析构也不会执行
------解决方案--------------------
A a;
你这样设定对象只会在结束作用域的时候析构,系统强制退出,析构了才见鬼了。
------解决方案--------------------
定时刷新到磁盘就可以了
------解决方案--------------------
别用cin.get(),让程序正常结束就好了。
------解决方案--------------------
不要企图优雅的结束(因为这是不可能办到的)
而要在烂的不能再烂的摊子上也能重整河山!
------解决方案--------------------
似乎很霸道!
------解决方案--------------------
写了一个控制台程序,在一个类的析构函数中,把数据刷新到磁盘文件中。我没有主动调用delete,而是程序结束时,系统清理类对象时,自动调用析构函数。
本来运行的好好的。很正常。可在二逼的舍友电脑上就不正常了。他说磁盘中文件中的数据更本没有刷新,老是0。我看他运行的时候,不是让程序正常结束,而是点控制台右上角的X,强制关闭。我猜想是析构函数没有运行。我让他正常结束程序后,就正常了。
我今天又写了一个测试程序,看看程序被强制退出时,析构函数会不会运行。
#include <iostream>
using namespace std;
class A{
public:
A(){cout<<"构造函数调用\n";}
~A(){cout<<"析构函数调用\n";}
};
int main()
{
A a;
cout<<"main 函数!\n";
cin.get();
return 0;
}
在控制台中,按ctrl-c结束进程,可以看到析构函数运行了。
为什么点右上方的X按钮,析构函数就不会运行呢?
怎样才能避免这种隐患?
析构函数没有运行会造成内存泄露吗?
------解决方案--------------------
你写一个死循环,点X之后程序也结束了。也就是说X是直接中断程序的。
析构函数没执行很正常。
系统会将进程申请的资源(全局资源除外)都释放掉。
------解决方案--------------------
直接打关掉又没事,当程序结束时,不管是堆或是栈都会被释放掉,有没有析构都无所谓了!
正常情况下,代码运行结束,程序并没有真正的结束,
还会调一下对象析构函数,和一些如atexit等函数.
------解决方案--------------------
及时刷新到硬盘才是正事.
------解决方案--------------------
Ctrl-C是给进程发了一个信号量 这个信号量导致cin.get()返回了 然后是main函数返回 触发A的析构
你X掉程序是相当于给程序发了一个的信号 相当于程序直接exit退出 也就是cin.get()根本没返回就退出了 肯定不会触发析构
你要X掉的时候捕捉到析构
就捕捉X掉时触发的这个信号或事件 然后在其中实现A的释放
------解决方案--------------------
强制终止程序,析构是没有机会执行的,就好像,你执行一个图形界面程序,一在任务管理器中让他强行终止,析构也不会执行
------解决方案--------------------
A a;
你这样设定对象只会在结束作用域的时候析构,系统强制退出,析构了才见鬼了。
------解决方案--------------------
定时刷新到磁盘就可以了
------解决方案--------------------
别用cin.get(),让程序正常结束就好了。
------解决方案--------------------
不要企图优雅的结束(因为这是不可能办到的)
而要在烂的不能再烂的摊子上也能重整河山!
------解决方案--------------------
------解决方案--------------------