3

我刚刚发现了 auto_ptr 的概念并且很喜欢它!由于 Qt 经常需要 QList 或 QVector<(some QObject or 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 来发挥其共享内存的魔力吗?父子自动内存管理是否仍然透明运行?谢谢

4

3 回答 3

12

Qt 有自己的智能指针类,它们在很多方面都优于std::auto_ptr,特别是其中一些可以毫无问题地放入容器中。std::auto_ptr具有所有权转移复制语义,因此如果您尝试将其放入容器中,将无法按预期工作。

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

于 2010-05-21T17:40:19.463 回答
2

如果您想要一个拥有指针所有权的容器,请查看提升指针容器。

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

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

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

// Destroyed here.
于 2010-05-21T18:45:03.143 回答
1

std::auto_ptr不能用于 in std::vector,因为std::vector期望能够复制其内容,而不能复制std::auto_ptr正常意义上的 a 。复制意味着以两个相同的东西结束,如果你有两个相同std::auto_ptr的 s,当它们超出范围时,它们指向的内容将被双重释放。(取而代之的是,auto_ptr被复制的对象的内部指针被清零,而被复制到的对象现在是旧的指针。)

使用shared_ptr,它通常作为boost::shared_ptr或在 Visual C++ 上可用std::tr1::shared_ptr,并且将在 C++0x 标准库中,或者使用 Qt 拥有的任何东西。这些可以被复制,因此可以进入容器。

于 2010-05-21T17:50:00.080 回答