退出程序时PostNcDestroy函数或出错

来源:百度知道 编辑:UC知道 时间:2024/05/18 10:51:21
我的一个基于对话框的MFC程序,程序运行中创建了两个非模态对话框,想在程序退出时释放this指针指向的堆内存,重载PostNcDestroy函数:
void CBigLogDlg::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this;
CDialog::PostNcDestroy();
}
但是运行程序后,退出时“嗡”的一声警报,但有没有任何消息框提示或者其他错误提示,所以错误不知从何查起。单独从Debug目录下打开程序也是如此,但Release版的程序却没有这个毛病,请高手指教,不胜感激!

这个帖子早已拜阅过,楼上的不是已经回复楼主了吗?所以估计别人也就不回复了。难道不行吗?

把基类的函数放到delete之前。
delete会迫使该类调用析构函数,析构函数会把与该类所有相关的资源进行释放。类的实例也就到此为止,类的实例都没了,就不应该再调用基类的函数了。
-----------------------------------------------
这个我自己没做过,我只在一本书中见过是在成员函数中自己释放自己的情况,但它做的好象就是在PostNcDestroy中调用DELETE的。
我没细研究过PostNcDestroy后,MFC是否还会进一步调用其他函数。如果会,因为在PostNcDestroy中调用了delete,使对象被析构,那么其他函数将无法得到机会被调用。

有一点必须清楚,只有发生了WM_CLOSE即窗口被关闭,才会有PostNcDestroy等一系列函数会被调用,并且PostNcDestroy是处于被调用的后端。但并不意味窗口被关闭,就必须要销毁对象。

另外,很少情况需要在函数体中调用delete的,只有外部无法访问析构函数时,才需要在类函数中提供delete,供外部使用。COM就是这样做的。我不知道你的程序究竟是什么结构,为何一定要在函数内部调用delete。这种做法很偏,应该是可以避免的。而且尽量不要打破MFC的框架,否则要先研究MFC的框架,然后才能在合适的函数中进行超常规的操作。

对话框中放EXE?什么意思没明白。是指对话框类型的工程中嵌入EXE文件资源?

P.S.看到你的HI图标了,你很崇拜他吗?

delete this;
放到
CDialog::PostNcDestroy();
后面试试