如何避免动态分配小部件中的内存泄漏

how to avoid memory leak in dynamically allocated widget

本文关键字:内存 泄漏 何避免 动态分配 小部      更新时间:2023-10-16

我必须在主窗口中显示一个小部件,而不使它成为主窗口的子窗口。因此,如果我动态分配内存空间,它将倾向于泄漏内存

Widget *wid = new Widget;
wid->show();

所以我想知道如何优雅地处理一个小部件的动态内存分配而不泄漏。

QT是相当老派的c++,所以它的许多例子只是使用原始指针和对delete的手动调用,而不符合RAII。这在实践中可以很好地工作,因为除了少数例外,大多数QObjects通常可以很快地将所有权转移到符合raii的容器中,并且因为Qt几乎不会抛出异常。

但是,它确实提供了自己的智能指针,像这样:

http://doc.qt.digia.com/4.6/qscopedpointer.html

QScopedPointer<Widget> wid(new Widget);
wid->show();
// `wid` will automatically call `delete` when it goes out of scope.

因为你经常需要转移所有权来做一些事情,比如在布局中插入子部件,take方法在这里变得很方便,它基本上相当于std::unique_ptrrelease方法。

我建议只使用标准的c++智能指针,如unique_ptr,在这种情况下,您可以这样做:

unique_ptr<Widget> wid(new Widget);
wid->show();

…但这取决于你是想深入QT还是更接近c++标准的领域。

您可以将mainwindow设置为父级并打开Qt::Window标志。