Qt --- 对象树机制、析构顺序导致崩溃

{
    QWidget widget;
    QPushButton buttonQuit("Quit",&widget);
}

 作为父组件的widget,子组件buttonQuit都是QObject的子类;上述代码运行没有问题。

代码析构时,因为C++的要求,局部对象的析构时按照实例化顺序逆向的顺序析构。当这段代码执行完成,会先析构buttonQuit,然后将其从父对象widget的子对象列表中删除。然后析构widget对象。

如果我们将代码携程下列样式:

{
    QPushButton pushbuttonQuit("Quit");
    QWidget widget;
    pushbuttonQuit.setParent(&widget);
}

这段代码将会出现崩溃:问题是pushbuttonQuit会被析构两次而崩溃;

当代码执行完成后,按照C++的析构顺序为对象生成顺序的逆序来析构,因为pushbuttonQuit在widget对象前生成,所以先析构widget对象,发现子列表中有子对象pushbuttonQuit,则也会将其析构;析构完widget对象后再去析构pushbuttonQuit,就会二次析构而崩溃。

在Qt中,析构父对象而默认也会将父对象的子对象列表一并析构,这种机制是Qt的对象树引入的,可以帮我们开发时解决一定的内存管理问题,但是也会引入这种类似的问题。

所以,开发时就要有良好的习惯,在构造时候就指定父对象,并且可以大胆在堆上创建。

你可能感兴趣的:(Qt,qt,开发语言)