【问题标题】:Which memory management method should we use in Qt?我们应该在 Qt 中使用哪种内存管理方法?
【发布时间】:2015-12-24 16:26:14
【问题描述】:

我对编程很陌生,因为我仍在学习如何高效地编码,所以我的问题可能看起来有点奇怪。

当我学习如何使用 Qt 编码时,我知道 Qt 有一个内存管理方法,当它本身被删除时,父级会删除它的所有子级,然后还有 QSharedPointer 和许多其他智能指针的东西(或者你可以提到boost::shared_ptr)。

我了解这两种方法究竟是如何工作的,但我的问题是,当涉及到 Qt 中整个系统结构的设计时,我是否应该让我的大部分课程成为 QObject 的子类并将所有权移交给 QT进行内存管理,或者只是使用boost::shared_ptr 或QSharedPointer 来避免潜在的内存泄漏?

如果我们同时采用这两种技术需要考虑很多问题,因为它可能会导致双重删除问题。

那么哪种技术性能更好,或者在设计上哪种更好?

【问题讨论】:

    标签: c++ qt boost smart-pointers qsharedpointer


    【解决方案1】:

    如您所知,Qt 有一个模型:

    QObjects 在对象树中组织自己。当您使用另一个对象作为父对象创建 QObject 时,它会添加到父对象的 children() 列表中,并在父对象存在时被删除。

    此外:

    您也可以自己删除子对象,它们会将自己从父对象中删除。

    因此,只要使用该模型,就不会出现双重释放问题。

    也就是说,我见过和使用的一种常见方法(但请注意,这样做是有理由的)是创建两个层,前者是纯粹基于 Qt 的层,而后者完全是 Qt-不知道。当然,它需要一个薄层来来回转换信息片段。
    在这样的模型中,可以合理地看到这两种方法都被应用,从不混合并且正常工作。

    那么,哪个是最好的?这取决于你的目标。

    如果底层是作为独立代码库的,我使用了混合方法用于用户界面。
    如果不是这种情况,并且您的项目是纯粹基于 Qt 的项目,那么没有理由不将所有内容都基于 Qt 本身所基于的模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2010-12-06
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多