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 *指针.向量将自动调用"智能指针"的析构函数,反过来,这些析构函数将破坏指向的对象.这个"链接"只能在"智能指针"的析构函数中显式实现,这就是普通原始指针无法帮助你的原因.
没有; 如果存储了指向自动对象的指针怎么办?
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)