我知道当std::vector
被破坏时,它会调用每个项目的析构函数。它是否将指针的析构函数称为对象?
vector<myclass*> stuff;
当东西被破坏时,内部指针指向的各个对象是否会被破坏?
答案 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);