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

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

我正在尝试为手机开发一个 Qt 应用程序,所以我决定不使用任何标准库(因为我担心某些平台可能还不受支持)。因此,我不得不在没有任何标准 header 的情况下重新实现智能指针包装器(当然使用标准草案)。在Qt中,有一些Widgets,比如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 的新指针。 现在回答我的问题,旧指针发生了什么?是什么跟踪他们?如何使用智能指针来替换这些裸指针,或者我是否必须坚持严格使用裸指针的“好旧方法”?

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

最佳答案

as I fear some platform may not yet be supported

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

即使没有,您也不需要实现自己的智能指针,因为 Qt 已经提供了很长时间:

Here你可以在 Thiago 那里找到关于它们的详尽解释。

因此,最重要的是:不要自己实现它们,因为您正在重新发明轮子,并且您很可能需要修复之前已修复的错误。现成的解决方案也可能比您从头开始实现并由其他人维护而无需您花费时间的情况下更好地扩展。

如果您只想处理 QObject 子类的自动构建和解构,您也可以使用 Qt 父/子层次结构。您可以在此处阅读有关该内容的更多信息:

Object Trees & Ownership

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

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

this 基本上是父窗口,例如 mainwindow,或者如果您有一个顶级小部件,它也可以是 Qt 应用程序对象,等等。

关于c++ - Qt 中的智能指针内存管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23147602/

相关文章:

c++ - 用于 Objective-C 的 iostream 和 sstream

c++ - 使用 UTF-8 时带有奇怪字符的 SFML 标题栏

qt - 是否可以在 Qt Creator 中将 Qt 样式表与提升的小部件一起使用?

linux - 使用 linux-arm-gnueabi-g++ 编译适用于 ARM 的 QT 时出现 XLib 错误

c++ - 在函数指针返回值中转换对指针的引用

c++ - 更改命令行参数 argv

c++ - 结构成员的结构大小和地址

c++ - Qt4中的条形码生成

c++ - Eigen 和 c++11 赋值和引用

c++ - 构造函数调用问题