在QT关闭时从子窗口句柄中删除内存

Delete memory to window handle from child on close in QT

本文关键字:窗口句柄 删除 内存 QT      更新时间:2023-10-16

让我们看看我的conf:

mainwindow.h
second_window.h
  1. 在类方法(public: second_window * h_window;)中保持指向second_window的指针
  2. mainwindow类打开second_window

second_window中我捕获eventClose();这里我想要delete h_window;但是我得到了一个访问错误,我认为窗口仍然打开,所以当我试图删除指针内存时,我得到了错误。

当我应该删除这个指针的其他想法?

如果为second_window设置了父对象,则不需要删除该对象:

h_window = new second_window(this); // in the constructor of mainwindow

当对象被删除并且它有子对象时,析构函数自动删除每个子对象。因此,当父对象被删除时,子对象也会自动被删除。

建议在堆上创建子对象并立即创建父对象。如果您不立即父化,您可以使用setParent()函数显式地父化。

如果出于某种原因你不希望你的对象有父对象,你也可以使用QSharedPointer来管理对象的生命周期

如果两个窗口都是独立的,因此没有父窗口,那么解决的方法是使用QPointer和setAttribute(Qt::WA_DeleteOnClose)。

class mainwindow : public QWidget {
  public:
    ~mainwindow() {
      delete h_window; // deletes h_window if it is not 0 (that is, not closed yet)
    }
    void showSecondWindow() {
      if ( ! h_window ) {
        h_window = new second_window();
      }
      h_window->show();
      h_window->activateWindow();
    }
  private:
    QPointer<second_window> h_window; // h_window will automatically become 0 when second_window is deleted.
}
class second_window : public QWidget {
  public:
    second_window() {
      setAttribute(Qt::WA_DeleteOnClose); // automatically delete itself when window is closed
    }
}