Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt中的智能指针内存管理器_C++_Qt_C++11_Smart Pointers_Qtcore - Fatal编程技术网

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

C++ Qt中的智能指针内存管理器,c++,qt,c++11,smart-pointers,qtcore,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 mainM

我正试图为手机开发一个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
我实现惟一的_ptr“observer”的唯一方法是使用get()、operator*和operator->member函数来访问底层成员。很明显,MenuBar()->addNew()返回指向另一个主菜单的新指针。 现在我的问题是,这个旧指针会发生什么变化?是什么跟踪他们的?如何使用智能指针来代替这些裸指针,或者我必须坚持严格使用裸指针的“好的老方法”

注意:可以找到所有文件

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

这感觉像是不正确的猜测。如今,每个移动平台都支持它,而Qt现在确实明确地依赖于标准库

即使没有,您也不需要实现自己的智能指针,因为Qt多年来一直提供以下功能:

你可以找到蒂亚戈对它们的详尽解释

因此,底线是:不要自己实现它们,因为您正在重新发明轮子,并且可能需要修复一段时间前已修复的bug。现成的解决方案也可能比您从头开始的实现扩展得更好,并且由他人维护,而您无需花费时间

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

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


其中,
这个
基本上是父对象,比如mainwindow,或者如果您有一个顶级小部件,它可以是Qt应用程序对象,等等。

使用Qt管理内存的最简单方法是利用它们的“对象树”结构。您可以在以下问题中了解更多信息:。基本上,Qt在
QObjects
之间保留一个父子关系树,当父对象被删除时,它会删除所有子对象。因此,请随意使用好的、旧的
新的QObject(父对象)
,让Qt为您处理清理工作。

我不是很确定,这就是为什么我说“可能”,这说明我有多不确定。我不想在这里暗示任何东西请注意,
QWidget
对象几乎总是有父对象。因此,您不能对它们使用“强”智能指针
QPointer
是一个弱智能指针,您应该(Qt5)将其用作对父对象的任何
QObject
的弱引用,并且仅当您确实需要它时才使用。
QMenu *mainMenu = new QMenu(this);
QToolBar *toolBar = new QToolBar(this);