QSharedPointer,如何传递它们,以及我是否需要它们

QSharedPointer, how to pass them around, and do I need them?

本文关键字:是否 何传递 QSharedPointer      更新时间:2023-10-16

几天来我一直在尝试理解共享指针,但感觉我似乎无法理解。不确定它是太明显了还是太复杂了。首先,有人能给我举一个例子吗?你会实际使用共享指针。维基百科上的例子对我来说毫无意义。你该如何将共享指针传递给另一个函数,或者用共享指针创建一个对象。那么,你是如何传递它的?你会在哪里使用它?任何信息或例子都会很棒。

此外,我有一个问题,我不知道该用什么。在这个函数中,我分配了一个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"抛出异常时在创建过程中处理指针的方法。

共享指针(以及其他类似的指针包装器)的目的是正确处理指向对象的指针的销毁。也就是说,不必手动确保删除最后一个副本(并且只删除最后一份副本),当它超出范围时,共享指针会为您处理它。共享部分意味着你可以创建这个包装器对象(共享指针对象)的副本,它将在副本之间"共享"指向对象的指针(就像你复制了一个常规指针一样),并增加了上述好处。

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

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

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

编辑:take()从作用域指针释放指向对象的所有权,因此当作用域指针被破坏时,它不会删除对象。当你把所有权转移给其他人时,你不会使用它——比如你的情况是MyObject