QSharedPointer,如何传递它们,我需要它们吗?

时间:2012-03-23 01:58:02

标签: c++ qt pointers shared-ptr qsharedpointer

现在试图了解共享指针几天,感觉好像我似乎无法得到它。不确定它是否只是显而易见或是否过于复杂。首先,有人可以给我一个例子,你实际上会使用共享指针。维基百科上的例子对我来说毫无意义。如何将共享指针传递给另一个函数或使用共享指针创建一个对象。那么,你如何传递它,你会在哪里使用它?任何信息或示例都会很棒。

另外,我有这个问题,我不知道该用什么。我有这个函数,我分配一个QFile并将其传递给另一个类中的函数。该函数将文件作为QIODevice*,然后创建包含该文件的对象。我想知道最好的解决方案是什么,以及如何(如果我应该)在这里使用共享指针?如何使用<QFile>创建共享指针并将其传递到函数所需的位置<QIODevice>。感觉就像我根本没有得到共享指针......

我的另一种方法是将QFile的分配放在QScopedPointer中。然后我将它传递给类,当创建存储文件的对象时,我使用QPointerQScopedPointer。在第一个调用函数的最后,我应该调用take()吧?

function () {
   QScopedPointer<QFile> item(new QFile("filename"));
   SomeClassObject->doStuff(item.data());
   item.take();
}
---------------------------------
SomeClass::doStuff(QIODevice *item) {
    _currentObject = new MyObject(item); // should _currentObject be a smartpointer?
    ...
}
---------------------------------
class MyObject {
    QPointer<QIODevice> _item;

    ...
    MyObject(QIODevice *item) {  _item = item; }
}

因此,如果“new”抛出异常,我想要一种存储指针的方法以及在创建过程中处理它们的方法。

1 个答案:

答案 0 :(得分:8)

共享指针(以及指针的其他类似包装器)的目的是正确处理指针对象的破坏。这不是必须手动确保删除最后一个副本(并且只删除最后一个副本),当共享指针超出范围时,共享指针会为您处理。共享部分意味着您可以创建此包装器对象(共享指针对象)的副本,它将“共享”副本之间的指针对象(就像您制作了常规指针的副本一样)并具有额外的好处如上所述。

至于您的代码,SomeClass::doStuff()应该有一个QScopedPointer<QFile>参数(而不是QIODevice*个参数),因为您将item传递给它,具有该类型。

MyObject的构造函数相同:请使用QPointer<QIODevice>QSharedPointer<QIODevice>类型的参数。通常,在使用指针的任何地方,请改用QSharedPointer(使用适当的模板类型)。这将使您免于以后与访问已删除对象相关的麻烦。

当然,有时您实际上需要原始QIODevice指针(例如,对于第三方库调用),然后您将使用共享指针对象的data()成员函数。只是确保你没有持久存储(即存储或以其他方式复制超出必要的)返回的原始指针,因为这将削弱共享指针的目的 - 共享指针将不知道你的额外原始指针不在管理共享指针对象。

编辑: take()从范围指针释放指向对象的所有权,因此当范围指针被销毁时,它不会删除该对象。当你将所有权转移给其他东西时,你会反对使用它 - 就像在你的情况下转移到MyObject