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

Wag*_*are 2 c++ qt qwidget

我必须在主窗口中显示一个widgetA,而不必将它作为mainwindow的子项.所以如果我动态分配内存空间,它将趋向于泄漏内存

Widget *wid = new Widget;
wid->show();
Run Code Online (Sandbox Code Playgroud)

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

Dra*_*rgy 5

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

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

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.
Run Code Online (Sandbox Code Playgroud)

由于您经常需要转移所有权以执行诸如将子窗口小部件插入布局之类的操作,因此该take方法在此处变得非常方便,这基本上等同于release方法std::unique_ptr.

我建议只是坚持使用标准的C++智能指针unique_ptr,在这种情况下你可以这样做:

unique_ptr<Widget> wid(new Widget);
wid->show();
Run Code Online (Sandbox Code Playgroud)

...但是,您是否想深入了解QT或更接近C++标准的领域取决于您.