【问题标题】:Does std::vector call the destructor of pointers to objects? [duplicate]std::vector 是否调用对象指针的析构函数? [复制]
【发布时间】:2012-03-15 22:28:54
【问题描述】:

可能重复:
Deleting pointers in a vector

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

vector<myclass*> stuff;

当东西被销毁时,东西内的指针指向的各个对象会被破坏吗?

【问题讨论】:

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


【解决方案1】:

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

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

此外,您似乎以某种方式相信“在指针上调用析构函数”(您的问题的第一部分)与“销毁指向的对象”(您的问题的第二部分)是一回事。实际上,这是两个完全不同的不相关的东西。

为了创建从前者到后者的链接,即使向量破坏指向的对象,您需要从某种“智能指针”构建向量,而不是普通的原始 myclass * 指针.向量将自动调用“智能指针”的析构函数,而这些析构函数又会销毁指向的对象。这个“链接”只能在“智能指针”的析构函数内显式实现,这就是为什么普通的原始指针在这里帮不了你。

【讨论】:

  • 实际上,如果你想精确一点,std::vector 不会破坏任何东西,分配器会
  • 这应该是公认的答案,因为它说明了为什么指针不是特殊情况。
【解决方案2】:

没有;如果你存储了一个指向自动对象的指针呢?

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

如果向量调用指针指向的对象的析构函数,自动对象将被销毁两次——一次是在超出范围时,一次是在向量超出范围时。另外,如果它们不应该被delete 释放怎么办?它不可能在任何情况下都表现得恰到好处。

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

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

【讨论】:

  • 嗯。我认为第二个词“因为”具有误导性。证明不删除指针的责任不在向量上;相反,OP 必须解释为什么容器应该以不同的方式处理指针类型的元素。就目前而言,答案可能很简单,“不”。
【解决方案3】:

没有。

std::vector 应该如何知道如何销毁指向的对象?它应该使用delete吗? delete[]? free?还有什么功能?它应该如何知道指向的对象实际上是动态分配的,或者它是唯一真正的所有者并负责销毁它们?

如果std::vector 是指向对象的唯一所有者,请使用std::unique_ptr,可能会使用自定义删除器来处理对象的清理。

【讨论】:

  • 如果std::vector 有一个构造函数,该构造函数对那些花花公子的元素采用破坏函数。它对遗留或 C API 很有用。但无论如何,更好的做事方式是用 RAII 类包装这类资源。
  • @wilhelmtell 你可以为此编写一个自定义分配器 :) 或者给 unique_ptr 一个自定义删除函数。
  • @SethCarnegie 是的,它在发表评论后几秒钟就击中了我。一直发生在我身上,先说后想。 :-S
猜你喜欢
  • 2014-05-07
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2011-01-17
  • 2023-03-31
  • 2015-03-01
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多