学习使用VS2010开发一个VC++对话框程序,重写了OnClose()函数,发现delete一个对象时总是发生异常。
pstr在对话框类中已经定义为CString*类型成员变量。在OnInitDialog()中new一个对象,比如pstr=newCString;然后为消息WM_CLOSE...
pstr在对话框类中已经定义为CString* 类型成员变量。在OnInitDialog()中 new一个对象,比如 pstr=new CString; 然后为消息 WM_CLOSE 添加函数 OnClose(),在 OnClose ()中 delete pstr,可以正常执行,但是继续执行CDialogEx::OnClose();时,程序异常。但是在OnOK()和OnCancel()中delete pstr 后,继续执行CDialogEx::OnOK();和CDialogEx::OnCancel();,窗口可以正常关闭,程序不会异常;代码如下:
void CTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
delete pstr;
CDialogEx::OnOK(); //正常关闭窗口
}
void CTestDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
delete pstr;
CDialogEx::OnCancel(); //正常关闭窗口
}
void CHestDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
delete pstr;
CDialogEx::OnClose(); //这里会发生异常
} 展开
void CTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
delete pstr;
CDialogEx::OnOK(); //正常关闭窗口
}
void CTestDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
delete pstr;
CDialogEx::OnCancel(); //正常关闭窗口
}
void CHestDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
delete pstr;
CDialogEx::OnClose(); //这里会发生异常
} 展开
2个回答
展开全部
我试了一下,在调用OnClose后又调用了OnBnClickedCancel,所以是多次delete的问题,应该在delete时这么写
if(pstr != NULL)
{
delete pstr;
pstr = NULL;
}
(1)点击IDOK按钮退出:先调用OnOK(),然后是OnDestory(),最后是PostNcDestroy()
(2)点击IDCANCEL按钮退出:先调用OnCancel(),然后是OnDestory(),最后是PostNcDestroy()
(3)点击右上角的关闭按钮退出:先OnClose(),然后是OnCancel(),再然后是OnDestory() ,最后是PostNcDestroy()
if(pstr != NULL)
{
delete pstr;
pstr = NULL;
}
(1)点击IDOK按钮退出:先调用OnOK(),然后是OnDestory(),最后是PostNcDestroy()
(2)点击IDCANCEL按钮退出:先调用OnCancel(),然后是OnDestory(),最后是PostNcDestroy()
(3)点击右上角的关闭按钮退出:先OnClose(),然后是OnCancel(),再然后是OnDestory() ,最后是PostNcDestroy()
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询