我刚刚发现了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进行共享内存魔术吗?父子自动记忆管理是否仍然透明地运作?感谢
答案 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所拥有的任何内容。这些可以被复制,因此可以进入容器。