【问题标题】:What smart pointer type do I need if I want to release the memory when re-pointing the pointer?如果我想在重新指向指针时释放内存,我需要什么智能指针类型?
【发布时间】:2012-03-22 22:18:30
【问题描述】:

我有一个类的实例变量,它将包含该类对象正在处理的当前对象。

class something {
    base* _currentOperation;
}

操作完成时发出信号,我只是将信号传递给作为当前类对象所有者的类。然后我创建一个新操作并将 _currentOperation-pointer 分配给该操作。当您重定向指针时是否有任何指针类型释放内存,或者我应该在将其分配给新对象之前调用“deleteLater()”?

例如,如果我在这里使用 QPointer,由于长期存储并且我不想要悬空指针,我如何在其中存储派生类型?

另外,谁能给我一个 QSharedPointer 的示例,您可以在其中存储派生类?以及如何将其传递给其他功能以及何时发布?试图找到 doc,但他们从未真正显示任何代码,您实际上可以如何使用它。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    如果您不打算拥有多个指针所有者,则要使用QScopedPointerQScopedPointer 承担指针的责任,并在 QScopedPointer 实例被销毁时将其销毁。查看documentation 了解详细信息。

    创建一个新指针

    
    
        QScopedPointer<base> _currentOperation;
    
    

    如果您不提供指向构造函数的指针,则默认为0。 _currentOperation 可以对base 类型的任何对象或base 的任何派生类型承担责任,就像普通指针一样(不要忘记使用虚拟析构函数)。

    当您想将_currentOperation 设置为新指针时,请使用

    
    
        _currentOperation.reset( the_new_pointer );
    
    

    reset 操作将首先销毁QScopedPointer 当前拥有的对象,然后取得the_new_pointer 的所有权。

    有几种方法可以传递指针。您可以通过引用传递QScopedPointer,或者如果您知道(尽管除非必要,否则不推荐)该对象在调用函数使用它时不会被删除,您可以通过调用_currentOperation.data() 来传递指针

    【讨论】:

    • 通过 ref 传递一个作用域指针真的很好吗?如果我想传递它并被许多人使用,我应该使用共享指针吗? atm im 使用 qpointer,重新指向时会自动释放它吗?
    • @chikuba 这取决于您所说的“通过它并被许多人使用”的意思。如果多个类实例将拥有它们自己的指针副本,那么您要使用 QSharedPointer。 QSharedPointer 将确保只要存在 QSharedPointer 的一份副本,指针就有效。但是,如果指针由单个实例拥有并且“被许多人使用”意味着您将它传递给在执行期间只使用指针的几个函数,那么通过 ref 传递 QScopedPointer 是正确的选择。
    • @chikuba QPointer 在对象被销毁时不会释放它。 QPointer 用于创建指向其他人拥有的对象的受保护指针。 QObject myObject; ... QPointer pNotMyObject = &amp;myObject; 如果myObject 被销毁,pNotMyObject 将被设置为 0(空)。但是,如果pNotMyObject 被销毁,myObject 不会受到影响。
    • atm 我的所有指针都在作用域中,除了我不创建或拥有的指针之外,然后我将它们保存在一个 qpointer 中,以便能够检查它是否仍然有效。此外,当我分配内存时,我在作用域指针中执行它,然后将其作为原始指针 (take()) 发送到将成为它的新所有者的任何类(然后将其存储在作用域指针中)。这种方法有什么问题吗?
    • 听起来很合理。如果您控制界面,我建议您稍作调整。我会通过 QScopedPointer 并允许新所有者调用 take()。这最大限度地减少了“原始”指针不受控制的时间。例如,如果在调用take() 之后但在新所有者取得控制权之前发生异常,则指针不会被删除。
    【解决方案2】:

    可重置智能指针通常会在重置(指向其他对象)时释放资源(内存)。否则他们不会很聪明!

    【讨论】:

    • 那是什么?自动、共享、范围?
    • 所有这三个,是的。可能还有其他人不这样工作,但我认为这很不寻常。
    【解决方案3】:

    我想你要的是QScopedPointer。我的answer to this question 也可能对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多