4

几天来一直试图理解共享指针,感觉好像我无法理解它。不知道是不是太明显了还是太复杂了。首先,谁能给我一个实际使用共享指针的例子。维基百科上的例子对我来说毫无意义。以及如何将共享指针传递给另一个函数或使用共享指针创建对象。那么,你如何传递它以及你会在哪里使用它?任何信息或示例都会很棒。

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

我的另一种方法是将分配QFileQScopedPointer. 然后我将它传递给类,在创建将存储文件的对象时,我使用QPointeror QScopedPointer。在第一个调用函数结束时,我应该调用 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”抛出异常,我想要一种存储指针的方法和一种在创建过程中处理它们的方法。

4

1 回答 1

9

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

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

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

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

编辑: take()从作用域指针释放指向对象的所有权,因此当作用域指针被销毁时,它不会删除该对象。当您将所有权转让给其他东西时,您不会使用它——比如在您的情况下MyObject

于 2012-03-23T02:09:59.533 回答