chi*_*uba 4 c++ qt pointers shared-ptr qsharedpointer
一直试图了解共享指针几天,感觉好像我似乎无法得到它.不确定它是否只是显而易见或是否过于复杂.首先,有人可以给我一个例子,你实际上会使用共享指针.维基百科上的例子对我来说毫无意义.如何将共享指针传递给另一个函数或使用共享指针创建一个对象.那么,你如何传递它,你会在哪里使用它?任何信息或示例都会很棒.
另外,我有这个问题,我不知道该用什么.我有这个函数,我分配一个QFile并将其传递给另一个类中的函数.该函数将文件作为a QIODevice*,然后创建包含该文件的对象.我想知道最好的解决方案是什么,以及如何(如果我应该)在这里使用共享指针?如何创建共享指针<QFile>并将其传递到函数所在的位置<QIODevice>.觉得我根本没有得到共享指针......
我的另一种方法是将分配QFile放入a 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; }
}
Run Code Online (Sandbox Code Playgroud)
因此,如果"new"抛出异常,我想要一种存储指针的方法以及在创建过程中处理它们的方法.
共享指针(以及指针的其他类似包装器)的要点是正确处理指针对象的破坏.这不是必须手动确保删除最后一个副本(并且只删除最后一个副本),当共享指针超出范围时,共享指针会为您处理.共享部分意味着您可以创建此包装器对象(共享指针对象)的副本,它将"共享"副本之间的指针对象(就像您制作了常规指针的副本一样)并具有额外的好处如上所述.
至于你的代码,当你传递给它时,SomeClass::doStuff()应该有一个QScopedPointer<QFile>参数(而不是QIODevice*一个)item,它具有该类型.
与MyObject构造函数相同:让它采用参数QPointer<QIODevice>或QSharedPointer<QIODevice>类型.通常,在使用指针的任何地方,请QSharedPointer改用(使用适当的模板类型).这将使您免于以后与访问已删除对象相关的麻烦.
当然,有时您实际上需要原始QIODevice指针(例如,对于第三方库调用),那么您将使用data()共享指针对象的成员函数.只是确保你没有持久存储(即存储或以其他方式复制超出必要的)返回的原始指针,因为这将削弱共享指针的目的 - 共享指针将不知道你的额外原始指针不在共享指针对象的管理.
编辑:
take()从范围指针释放指向对象的所有权,因此当范围指针被销毁时,它不会删除该对象.当你将所有权转移给其他东西时,你会反对使用它 - 就像你的情况一样MyObject.