• 4180阅读
  • 1回复

一个对象只调用了构造函数一次,却调用了析购函数两次,这是怎么回事? [复制链接]

上一主题 下一主题
离线noeatfox
 

只看楼主 倒序阅读 楼主  发表于: 2013-12-27
#include "prewindow.h"

PreWindow::PreWindow()
{
    startButton=new QPushButton(tr("begin"),this);
    connect(startButton,SIGNAL(clicked()),this,SLOT(invokeGame()));
    setAttribute(Qt::WA_DeleteOnClose);
    qDebug()<<"in PreWindow constructor";
}

PreWindow::~PreWindow()
{
    qDebug()<<"in PreWindow destructor";
}

void PreWindow::invokeGame()
{
    hide();
    win=new MainWindow(this);
    win->showInPre(this);
}
进入程序后,我并没有按BUTTON,直接按关闭,但下面的输出窗口显示
tarting D:\My documents\exercise\wlcenhence\debug\wlcenhence.exe...
in PreWindow constructor
in PreWindow destructor
in PreWindow destructor
D:\My documents\exercise\wlcenhence\debug\wlcenhence.exe exited with code -1073741819
请问这是怎么回事。

程序说明:这个PREWINDOW只是一个菜单窗口,目前只添加了一个BUTTON,就调用程序主窗口的SLOT,如果我按下BUTTON,进入主窗口,然后直接按关闭,倒能正常退出,PREWINDOW的DESTRUCTOR只调用一次,你说奇怪不?
离线friendbaby

只看该作者 1楼 发表于: 2013-12-28
我想你的 PreWindow类对象在 main函数中一定是  在栈上创建的局部变量
因为Qt::WA_DeleteOnClose属性,所以你关闭窗口的时候,该对象会被析构,而出了main函数,程序还会自动调用PreWindow的析构函数,这当然会出错。
所以不要对局部对象使用Qt::WA_DeleteOnClose属性。




你的第二个问题, hide()函数和close()函数是有区别的, hide函数只是让窗口不可见,而close还会发送closeEvent事件
Smiling is best language , can express everything , also can conceal everything.
快速回复
限100 字节
 
上一个 下一个