Qt中的智能指针内存管理器

时间:2014-04-18 04:56:58

标签: c++ qt c++11 smart-pointers qtcore

我正在尝试为移动电话开发Qt应用程序,因此我决定不使用任何标准库(因为我担心某些平台可能尚未得到支持)。所以,我不得不重新实现智能指针包装器(当然使用标准草案),没有任何标准头文件。在Qt中,有一些小部件,例如QMenu和QToolBar,当需要创建时 - 它就是这样创建的

QMenu *mainMenu = new QMenu;
QToolBar *toolBar = new QToolBar;
//To add a new menu bar or ToolBar, we do
mainMenu = menuBar()->addMenu("&File");
//add all the elements to the first menuBar
mainMenu->addAction(QAction { });
mainMenu = menuBar()->addMenu("&Edit"); //for second Menu
//same goes for QToolBar

我实现unique_ptr"观察者"的唯一方法是使用get(),operator *和operator->成员函数来访问底层成员。显而易见的是,MenuBar() - > addNew()返回一个指向另一个mainMenu的新指针。 现在我的问题是,旧指针会发生什么?什么跟踪他们?如何使用智能指针代替这些裸指针,或者我必须坚持使用“旧方法”#34;严格使用裸指针?

注意:可以找到所有文件here

2 个答案:

答案 0 :(得分:10)

  

因为我担心某些平台可能尚未得到支持

这感觉就像猜错了。现在每个移动平台都支持它,而Qt现在明确依赖于标准库。

即使它没有,你也不需要实现自己的智能指针,因为Qt已经提供了这些年龄:

Here你可以通过蒂亚戈找到关于他们的详尽解释。

所以,最重要的是:不要自己实现它们,因为你正在重新发明轮子,很可能你需要修复一段时间前修复过的bug。现成的解决方案也可能比从头开始实施更好的扩展,并由其他人维护,而无需花时间使用它。

如果您只想处理QObject子类的自动构造和解构,您还可以使用Qt父/子层次结构。在这里你可以阅读更多关于那个:

Object Trees & Ownership

这意味着,您可以为QWidgets编写类似的内容(因为它们也是QObjets):

QMenu *mainMenu = new QMenu(this);
QToolBar *toolBar = new QToolBar(this);

其中this基本上是父类,如mainwindow,或者如果你有一个顶级小部件,它可能是Qt应用程序对象,依此类推。

答案 1 :(得分:3)

使用Qt管理内存的最简单方法是利用其“对象树”结构。您可以在此问题中详细了解它:Memory management in Qt?。基本上,Qt在QObjects之间保留父子关系树,当删除父对象时,它会删除所有子对象。所以请随意使用好的旧new QObject(parent),让Qt为您处理清理工作。