std :: vector是否调用指向对象的指针的析构函数?

时间:2012-02-25 21:30:41

标签: c++ memory-management stl vector destructor

  

可能重复:
  Deleting pointers in a vector

我知道当std::vector被破坏时,它会调用每个项目的析构函数。它是否将指针的析构函数称为对象?

vector<myclass*> stuff;

当东西被破坏时,内部指针指向的各个对象是否会被破坏?

3 个答案:

答案 0 :(得分:33)

没有

std::vector如何知道如何销毁指向对象?它应该使用delete吗? delete[]free?其他一些功能?如何知道指向的对象实际上是动态分配的,还是它是One True Owner并负责销毁它们?

如果std::vector是指向对象的One True Owner,请使用std::unique_ptr,可能使用自定义删除器来处理对象的清理。

答案 1 :(得分:15)

正如你自己说的那样,vector确实为它的元素调用了析构函数。因此,在您的示例中,向量执行调用“指针的析构函数”。但是,您必须记住指针类型没有析构函数。只有类类型可以有析构函数。指针不是类。因此,更恰当的说法std::vector将伪析构函数调用语法应用于存储在向量中的指针对象。对于导致无操作的指针类型,即它什么都不做。

这也回答了问题的第二部分:指针指向的myclass对象是否被破坏。不,他们不会被摧毁。

此外,您似乎在某种程度上认为“在指针上调用析构函数”(问题的第一部分)与“销毁指向对象”(问题的第二部分)相同。实际上,这是两个完全不同的无关事物。

为了创建从前者到后者的链接,即为了使向量销毁指向的对象,你需要从某种“智能指针”构建你的向量,而不是普通的原始{{1} }指针。向量将自动调用“智能指针”的析构函数,反过来,这些析构函数将破坏指向的对象。这个“链接”只能在“智能指针”的析构函数中显式实现,这就是普通原始指针无法帮助你的原因。

答案 2 :(得分:5)

没有;如果存储了指向自动对象的指针怎么办?

vector<T*> v;
T tinst;
v.push_back(&tinst);

如果向量调用指针所指向的对象的析构函数,则自动对象将被破坏两次 - 一次超出范围时,一次当向量超出范围时。另外,如果它们不应该被delete解除分配呢?在任何情况下都无法表现得恰到好处。

如果您的对象都是动态分配的,则必须手动迭代向量,并且如果每个指针都使用delete分配,则必须new。或者,您可以创建一个智能指针向量,释放指针指向的对象:

vector<shared_ptr<T>> v;
v.push_back(new T);