Qt:如何使用Qt的Smartpointers

ndb*_*dbd 5 c++ qt smart-pointers c++11

我有"老式"C++编程经验(即我关心指针和内存管理).我确实想利用现代概念.

由于我的应用程序大量使用Qt,我想使用Qt的智能指针.然而,我对一般的智能指针以及它们在Qt中的使用感到有些困惑.

1.)据我了解,如果我从中得到QObject,我应该更好地坚持Qt的对象树和所有权模型,而忘记智能指针.正确?

2.)在C++中我可以用std::shared_ptrstd::unique_ptr.Qt中的等效智能指针是什么?

假设我有以下代码:

QList<MyObject *> * foobar(MyOtherObject *ptr) {

   // do some stuff with MyOtherObject

   QList<MyObject* > ls = new QList<MyObject*>();
   for(int i=0;i<10;i++) {    
       MyObject* mi = new MyObject();
       ...
       ls.insert(mi);
   }
   return ls;
}

int main() {

   MyOtherObject* foo = new MyOtherObject();
   QList<MyObject*> *bar = foobar(foo);
  // do stuff
  // and don't care about cleaning up?!
}
Run Code Online (Sandbox Code Playgroud)

3.)如何使用智能指针将上述代码段翻译成版本?

4.)特别是:我应该将功能签名更改为使用智能指针吗?它似乎创建了非常复杂的类型签名(返回类型和传递的参数).另外,如果某些"遗留"函数调用另一个函数 - 使用原始指针编写函数签名更好,并且仅使用智能指针"内部"函数吗?

5)什么智能指针应更换ls的功能foobar?什么是应该用于的指针类型mi,即存储在QList?中的对象?

Cal*_*eth 4

您几乎被迫使用QtGUI 对象拥有原始指针的习惯用法,因为QWidget派生类型将假定子元素的所有权。

在其他地方,您应该尽可能避免使用任何类型的指针。大多数时候你可以传递一个参考。如果您需要多态所有权,请使用std::unique_ptr. 在极少数情况下,您有多个独立的生命周期,需要共享资源的所有权,为此您使用std::shared_ptr.

Qt 集合类也与现代 C++ 结构交互不良,例如

extern QList<Foo> getFoos();

for (const Foo & foo : getFoos()) 
{ /*foo is a dangling reference here*/ }

for (const Foo & foo : std::as_const(getFoos()))
{ /*This is safe*/ }
Run Code Online (Sandbox Code Playgroud)

你的片段将是

std::vector<std::unique_ptr<MyObject>> foobar(MyOtherObject & obj) {

   // do some stuff with MyOtherObject

   std::vector<std::unique_ptr<MyObject>> ls;
   for(int i=0;i<10;i++)
   { 
       ls.emplace_back(std::make_unique<MyObject>());
       ...
   }
   return ls;
}

int main() {

   MyOtherObject foo = MyOtherObject;
   auto bar = foobar(foo);
  // do stuff
  // destructors do the cleanup automatically
}
Run Code Online (Sandbox Code Playgroud)