滕州网站建设助企网络,有关于网站建设的参考文献,网页浏览器怎么扫描二维码,app软件开发学什么专业在Qt中#xff0c;当你将一个对象设置为另一个对象的子对象时#xff0c;Qt会自动管理它们的生命周期#xff0c;包括子对象在堆上分配的内存空间。这意味着#xff0c;如果你使用 new 在堆上创建了一个子对象#xff0c;并将其设置为另一个对象的子对象#xff0c;当父对…在Qt中当你将一个对象设置为另一个对象的子对象时Qt会自动管理它们的生命周期包括子对象在堆上分配的内存空间。这意味着如果你使用 new 在堆上创建了一个子对象并将其设置为另一个对象的子对象当父对象被销毁时Qt会自动删除子对象并释放其内存空间以避免内存泄漏。
QT中对象的基类是QObject其构造函数为实例传入父指针同时提供children()函数返回QObjectList获取所有子对象。这是QT的内存管理机制创建一个QObject对象时其会被添加到其父对象的子列表中当父对象析构时其子对象列表中的所有对象会被析构。此外析构子对象会对应删除父对象子列表中的对应项。
这是为了应对在某个控件下new新的空间后没有及时delete的情况在对象树结构下父控件销毁时子空间及布局管理器会被一并销毁。但是如果构造时的父对象为null就需要对应的手动delete。
问题
C中的析构按照构造相反的顺序如果先创建子对象再创建父对象使用set方法把子对象加入父对象内在这种情况下析构时析构函数会先析构父对象子列表中的所有子对象再析构父对象再析构子对象。此时子对象已经被析构所以会导致程序崩溃。
#include QApplication
#include QPushButtonint main(int argc, char *argv[])
{QApplication a(argc, argv);QPushButton btn(button);QWidget widget;btn.setParent(widget);widget.show();return a.exec();
}
结论
QT对象树机制无疑是内存管理的有效手段但其使用需要规范
先创建父对象再创建子对象子对象创建时指示父对象尽量在堆上创建子对象避免父控件子列表悬空指针参考堆和栈上对象创建的区别QObject不能使用static修饰保证QObject对象在QApplication创建后创建、销毁前销毁