Qt开发中的new与delete问题

📅 2026/7/11 22:44:55
Qt开发中的new与delete问题
在进行qt开发时比如需要创建一个按钮控件。可以在头文件中进行声明如QPushButton *pushButton1;之后在.cpp文件中的初始化函数中进行创建如pushButton1 new QPushButton(“test”, this); 全程没有在析构函数中进行删除工作也正常可是我记得使用new实例化对象是在堆中操作后续应该手动删除的这里为什么不用呢这个涉及到Qt的内存管理。这样理解没有问题在C中使用new在堆上分配的内存确实需要手动delete否则会内存泄漏。此处不会泄漏的原因在于Qt引入了一套父子对象Parent-Child机制和对象树Object Tree。pushButton1 new QPushButton(“窗口皮肤 1”, this);构造函数的第二个参数是 this。这行代码做了两件事一是在堆上创建了一个按钮。二是将 this即当前窗口设置为这个按钮的父对象Parent。而Qt的规则是 当一个父对象QObject或其派生类被析构销毁时它会自动遍历并先析构它所拥有的所有子对象Children。所以pushButton1 的内存是由它的父窗口负责回收的我们不需要也不应该手动去delete它。相反如果此时我们手动删除还有很大机率会出问题导致内存泄漏。推荐使用智能指针即使忘记设置父对象内存也能自动释放// 头文件中std::unique_ptr pushButton1;// cpp中pushButton1 std::make_unique(“窗口皮肤 1”, this); // 不需要手动delete离开作用域自动释放唯一需要手动delete的情况就是当你new一个对象时没有指定父对象parent为nullptr且这个对象不会自动被其他机制管理。例如QPushButton *floatingButton new QPushButton(“test”); // 这种情况必须手动 delete否则内存泄漏总结堆内存你只管newQt负责delete只要设置了父对象。析构顺序先析构子对象再析构父对象与构造顺序相反。本质Qt在QObject内部维护了一个QListQObject* children链表。addChild()在构造函数中执行deleteChildren()在父析构函数中执行。