Qt和auto_ptr

时间:2010-05-21 17:31:09

标签: c++ qt auto-ptr

我刚刚发现了auto_ptr的概念,我很喜欢它!由于Qt经常需要QList或QVector<(某些QObject或QWidget)*>,因此应该避免使用auto_ptr的任何具体原因。如果我是对的,它允许你替换它:

std::vector<MyClass*> vec;
/* add several elements to the vector and do stuff with them */
for(size_t i=0; i<vec.length(); ++i)
{
    delete vec[i];
}
vec.clear();

更短的事情(即没有清理)

std::vector<auto_ptr<MyClass>> vec;
/* add several elements to the vector and do stuff with them */
// no need for the delete loop

... Qt仍可以使用auto_ptr进行共享内存魔术吗?父子自动记忆管理是否仍然透明地运作?感谢

3 个答案:

答案 0 :(得分:12)

Qt有自己的智能指针类,在许多方面优于std::auto_ptr,特别是因为其中一些可以放入容器中而没有任何问题。 std::auto_ptr具有所有权转移副本语义,因此如果您尝试将其放入容器中,则无法按预期工作。

尝试使用QSharedPointer。它是一个引用计数智能指针,当没有更多的智能指针副本时,它会删除其包含的对象。与std::auto_ptr不同,同时可以存在同一QSharedPointer的多个副本,因此它可以很好地与容器配合使用。

答案 1 :(得分:2)

如果你想要一个拥有指针所有权的容器,那么请查看boost指针容器。

您将指针放入容器中,但与其他容器一样,它们将被视为普通对象,这使得它们更容易与标准算法一起使用(即无需编写包装类)。当指针容器超出范围时,它将在容器中的所有指针上调用delete:

boost::ptr_vector<MyClass>   v;
v.push_back(new MyClass(12));

std::for_each(v.begin(), v.end(), DoStuff());

// Destroyed here.

答案 2 :(得分:1)

std::auto_ptr无法在std::vector中使用,因为std::vector期望能够复制其内容,并且您无法正常意义上复制std::auto_ptr。复制意味着用两个相同的东西结束,如果你有两个相同的std::auto_ptr s,当他们超出范围时,他们所指出的将被双重释放。 (相反的是,被复制的auto_ptr将其内部指针清零,而复制到的那个现在是以前的旧指针。)

使用shared_ptr,它通常以boost::shared_ptr或Visual C ++ std::tr1::shared_ptr的形式提供,它将位于C ++ 0x标准库中,或者使用Qt所拥有的任何内容。这些可以被复制,因此可以进入容器。