第一个MainWindow在main中打开,然后当我尝试打开第二个时 窗口程序崩溃了SIGABRT。 调试器显示以下行:
double free or corruption (out): 0x00007fffffffe340 ***
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
RTTI symbol not found for class 'QObject'
我想了解调用析构函数的正确方法, 如果我没有设置Qt :: WA_DeleteOnClose属性,程序可以工作 如果我在第二个窗口中执行相同的操作(IE我在第二个QMainwindow中打开第三个窗口),即使我设置了Qt :: WA_DeleteOnClose属性,该程序也能正常工作。为什么我只能在第一个QMainWindow中执行此操作?我在主打开的那个?
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setAttribute(Qt::WA_DeleteOnClose);
QTimer *t = new QTimer(this);
connect(t,SIGNAL(timeout()),this,SLOT(open_new()));
t->start(1000);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::open_new(){
MainWindow2 *win_2 = new MainWindow2(0);
win_2->show();
this->close();
}
答案 0 :(得分:5)
在Qt中,所有QWidgets都是这样管理的:
operator delete
)。也就是说,所有子窗口小部件必须由operator new
创建,或者必须在父窗口之前被销毁(参见@BenjaminT评论)。operator delete
自己的调用(通过使用成员函数deleteLater()
,请参阅@BenjaminT注释) ,同时处理close
信号(实际delete
被调用,稍后,即不在插槽代码内,请参阅@DmitrySazonov评论)。同样,(a)申请本身不应该这样做,因为它是多余的; (b)仍应使用operator new
创建小部件。在您的情况下,第一个MainWindow可能不是使用new operator
创建的,因此它不能设置WA_DeleteOnClose属性。但是下面的代码应该可以正常工作:
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MainWindow* w = new MainWindow(0);
// redundant if the attibute is set inside the class constructor
//w->setAttribute(Qt::WA_DeleteOnClose);
w->show();
return app.exec();
}