【问题标题】:Smart pointers memory managers in QtQt 中的智能指针内存管理器
【发布时间】:2014-06-02 13:52:58
【问题描述】:

我正在尝试为手机开发 Qt 应用程序,因此我决定不使用任何标准库(因为我担心某些平台可能还不支持)。所以,我不得不重新实现智能指针包装器(当然是使用标准草案),而不需要任何标准头文件。在Qt中,有一些Widget,比如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

【问题讨论】:

  • 我不太确定,这就是为什么我说“可能”,这说明了我的不确定性。我不想在这里暗示什么
  • 请注意QWidget 对象几乎总是有父对象。因此,您不能对它们使用“强”智能指针。 QPointer 是你应该 (Qt5) 用作对任何带有父级的 QObject 的弱引用的弱智能指针,并且只有在你真正需要它的时候。

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


【解决方案1】:

因为我担心某些平台可能还不支持

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

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

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

所以,底线就是这样:不要自己实现它们,因为你正在重新发明轮子,而且很可能你需要修复之前修复的错误。现成的解决方案也可能比您从头开始并由其他人维护的实现更好地扩展,而您无需花时间使用它。

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

Object Trees & Ownership

也就是说,你可以为QWidgets 写这样的东西(因为他们也是QObjets):

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      相关资源
      最近更新 更多