ndb*_*dbd 5 c++ qt smart-pointers c++11
我有"老式"C++编程经验(即我关心指针和内存管理).我确实想利用现代概念.
由于我的应用程序大量使用Qt,我想使用Qt的智能指针.然而,我对一般的智能指针以及它们在Qt中的使用感到有些困惑.
1.)据我了解,如果我从中得到QObject,我应该更好地坚持Qt的对象树和所有权模型,而忘记智能指针.正确?
2.)在C++中我可以用std::shared_ptr和std::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?中的对象?
您几乎被迫使用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)