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

22 c++ destructor memory-management stl vector

可能重复:
删除向量中的指针

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

vector<myclass*> stuff;
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*lis 34

没有.

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

如果std::vector是指向对象的One True Owner,则可以使用std::unique_ptr自定义删除程序来处理对象的清理.


AnT*_*AnT 15

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

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

此外,似乎你不知何故相信"在指针上调用析构函数"(问题的第一部分)与"销毁指向的对象"(问题的第二部分)是一回事.实际上,这是两个完全不同的无关事物.

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


Set*_*gie 5

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

vector<T*> v;
T tinst;
v.push_back(&tinst);
Run Code Online (Sandbox Code Playgroud)

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

如果您的对象都是动态分配的,则必须手动迭代向量和delete每个指针(如果已分配)new.或者,您可以创建一个智能指针向量,它将释放指针指向的对象:

vector<shared_ptr<T>> v;
v.push_back(new T);
Run Code Online (Sandbox Code Playgroud)