关于窗口关闭释放内存,主窗口下的子窗口关闭释放不用等到主窗口关闭>setAttribute(Qt::WA_DeleteOnClose);而且无需手动释放
QWidget重写closeEvent后,点击关闭时释放内存会调用析构函数,但需注意内存释放的时机和方式。
关闭事件与析构函数的关系
重写closeEvent时,若在事件处理中调用deleteLater()或手动删除对象,析构函数会被触发。但需注意:
deleteLater()会将删除操作推迟到事件循环结束后执行,避免在事件处理中直接析构导致问题 。 12
若仅调用close()而未设置Qt::WA_DeleteOnClose属性,窗口对象不会被销毁,析构函数也不会立即调用 。 13
内存释放的两种方式
自动释放:
设置属性Qt::WA_DeleteOnClose,关闭窗口时自动调用析构函数并释放内存 。 13
cpp
Copy Code
widget->setAttribute(Qt::WA_DeleteOnClose);
手动释放:
重写closeEvent,显式调用deleteLater()或delete 。 24
cpp
Copy Code
void closeEvent(QCloseEvent *event) override {
deleteLater(); // 安全释放
event->accept();
}
注意事项
父对象管理:若QWidget有父对象,父对象析构时会自动销毁子对象,无需手动释放 。 5
异常风险:栈上对象关闭时若设置Qt::WA_DeleteOnClose可能导致异常,堆上对象则无此问题 。