【问题标题】:Does Deleting a Dynamically Allocated Vector Clear It's Contents删除动态分配的向量是否会清除其内容
【发布时间】:2015-08-27 09:05:37
【问题描述】:

说我有:

vector<string>* foo = new vector<string>();

我添加了大量的东西,使用它,然后我只是调用:

delete foo;

我需要先致电foo.clear(); 吗?或者delete 会调用析构函数吗?

请不要让 cmets 知道这是多么愚蠢,我知道这里至少应该使用自动指针。这种行为存在于我正在使用的代码库中,我无法修复它。

【问题讨论】:

  • 您可以在 Internet 上的多个地方找到有关标准容器的信息以及标准中的几乎所有其他内容。您可以搜索“std::vector destructor”来查找该信息
  • 一旦你删除了它,你为什么要关心它是否被清除了?
  • @Ben He 可能会担心所包含对象的析构函数被调用。
  • @Ben:这样你就不会出现内存泄漏?还是元素破坏失败的其他不良影响?为什么不会你在乎?

标签: c++ vector destructor dynamic-memory-allocation


【解决方案1】:

是的,vector 的析构函数将被调用,这将清除其内容。

delete 在取消分配内存之前调用析构函数,vector 的析构函数隐式调用 .clear()(正如您从让自动存储持续时间 vector 超出范围中知道的那样)。

这很容易测试,vector&lt;T&gt; 在其中T 在销毁时写入std::cout(但要注意vector 内部的副本):

#include <vector>
#include <iostream>

struct T
{
    T() { std::cout << "!\n"; }
    T(const T&) { std::cout << "*\n"; }
    ~T() { std::cout << "~\n"; }
};

int main()
{
    std::vector<T>* ptr = new std::vector<T>();
    ptr->emplace_back();
    ptr->emplace_back();
    ptr->emplace_back();

    delete(ptr);  // expecting as many "~" as "!" and "*" combined
}

(live demo)

【讨论】:

    【解决方案2】:

    根据容器的要求(C++ 标准,表 96 — 容器要求)

    (&a)->~X() - 将析构函数应用于 a 的每个元素;所有内存都被释放了。

    其中 X 表示包含 T 类型对象的容器类,a 和 b 表示 X 类型的值,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-17
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多