如何避免动态分配的小部件中的内存泄漏
how to avoid memory leak in dynamically allocated widget
我必须在 mainwindow 中显示 widgetA 而不是将其作为 mainwindow 的子项。所以如果我动态分配内存space,它会趋向于泄漏内存
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
方法在这里变得很方便,它基本上等同于 [=16= 的 release
方法].
我建议只使用标准的 C++ 智能指针,例如 unique_ptr
,在这种情况下,您可以这样做:
unique_ptr<Widget> wid(new Widget);
wid->show();
...但是你是想更深入地了解 QT 还是更接近 C++ 标准的领域,这取决于你。
您可以将 mainwindow
设置为父项并打开 Qt::Window
标志。这是 "Qt way".
我必须在 mainwindow 中显示 widgetA 而不是将其作为 mainwindow 的子项。所以如果我动态分配内存space,它会趋向于泄漏内存
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
方法在这里变得很方便,它基本上等同于 [=16= 的 release
方法].
我建议只使用标准的 C++ 智能指针,例如 unique_ptr
,在这种情况下,您可以这样做:
unique_ptr<Widget> wid(new Widget);
wid->show();
...但是你是想更深入地了解 QT 还是更接近 C++ 标准的领域,这取决于你。
您可以将 mainwindow
设置为父项并打开 Qt::Window
标志。这是 "Qt way".