QT中对象释放顺序的一个示例

    技术2025-01-26  23

          为了研究Qt中对象释放,先编写一个简单的QT 应用程序。源代码如下:

    #include<qapplication.h> #include<qwidget.h> #include<qpushbutton.h> int main(int argc,char* argv[]) { QApplication hwApp(argc,argv); QPushButton hwButton("This is a button"); //创建一个Button对象 QWidget window; hwButton.setParent(&window); //设置window为父窗口 window.show(); return hwApp.exec(); }

     

     

       初步一看,代码没啥问题,运行也OK。 但是当关闭窗口后,出现了Crash。 怎么回事???

     

       仔细查看代码,发现应该是创建的window对象,在关闭窗口时,弹出栈释放, 同时也将子窗口hwButton也释放。然后,创建的hwButton对象又进行弹出栈, 造成了重复释放。 难怪会出现上述问题。

     

       修正方法是:将window对象放在hwButton对象之前进行定义初始化。 这样一来,运行时,从栈顶到栈底的对象依次是hwButton, window, hwApp.    运行关闭窗口时,hwButton先出栈释放,然后通知其父窗口window将其移除在,不再进行重复释放。

     

       OK! 最后问题得以解决。

     

     

     

    最新回复(0)