QSharedPointer,如何传递它们,以及我是否需要它们
QSharedPointer, how to pass them around, and do I need them?
几天来我一直在尝试理解共享指针,但感觉我似乎无法理解。不确定它是太明显了还是太复杂了。首先,有人能给我举一个例子吗?你会实际使用共享指针。维基百科上的例子对我来说毫无意义。你该如何将共享指针传递给另一个函数,或者用共享指针创建一个对象。那么,你是如何传递它的?你会在哪里使用它?任何信息或例子都会很棒。
此外,我有一个问题,我不知道该用什么。在这个函数中,我分配了一个QFile
,并将其传递给另一个类中的函数。该函数将文件作为QIODevice*
,然后创建一个包含该文件的对象。我想知道这里的最佳解决方案是什么,以及如何(如果我应该)在这里使用共享指针?如何使用<QFile>
创建一个共享指针,并将其传递到函数接受<QIODevice>
的位置。感觉我根本没有得到共享的指针。。。
我的另一种方法是将QFile
的分配放在QScopedPointer
中。然后我将它传递给类,在创建将存储文件的对象时,我使用QPointer
或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"抛出异常时在创建过程中处理指针的方法。
共享指针(以及其他类似的指针包装器)的目的是正确处理指向对象的指针的销毁。也就是说,不必手动确保删除最后一个副本(并且只删除最后一份副本),当它超出范围时,共享指针会为您处理它。共享部分意味着你可以创建这个包装器对象(共享指针对象)的副本,它将在副本之间"共享"指向对象的指针(就像你复制了一个常规指针一样),并增加了上述好处。
至于您的代码,SomeClass::doStuff()
应该有一个QScopedPointer<QFile>
参数(而不是QIODevice*
参数),因为您将item
传递给它,它具有该类型。
与MyObject
的构造函数相同:让它接受QPointer<QIODevice>
或QSharedPointer<QIODevice>
类型的参数。通常,在任何需要使用指针的地方,都要使用QSharedPointer
(使用适当的模板类型)。这将使您免于以后访问已删除对象时遇到的麻烦。
当然,有时您实际上需要原始QIODevice
指针(例如,用于第三方库调用),然后您将使用共享指针对象的data()
成员函数。只需确保您不会持久保存(即存储或以其他方式复制超出所需的内容)返回的原始指针,因为这会削弱共享指针的用途——共享指针不会知道您的额外原始指针不在共享指针对象的管理之下。
编辑:take()
从作用域指针释放指向对象的所有权,因此当作用域指针被破坏时,它不会删除对象。当你把所有权转移给其他人时,你不会使用它——比如你的情况是MyObject
。
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 通过网络、跨平台传递std::变体是否安全
- 堆栈和队列是否像C++中的数组一样传递?
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 是否可以在命令行中将输入参数传递给可执行文件
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 是否可以遍历传递给函数的数组?
- 是否可以传递具有捕获的不可复制(移动)值的 lambda
- 默认情况下是否可以传递"this"?
- 是否可以传递 std::array 的引用
- STL 集合的插入方法是否复制传递对象的值?
- 如何判断我的 ActiveMQ 消息是否已传递到最终目的地
- 关键字是否"virtual"传递给中间基类?
- c++ 11中是否有传递嵌套初始化器列表来构造2D矩阵的方法?
- 确定是否正在传递一个临时的
- 是否可以传递“int *[LENGTH]”而不是“int [][LENGTH]”