?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可能導致異常,堆上對象則無此問題 。 ?