删除动态分配的矢量是否清除它的内容

时间:2015-06-11 15:10:08

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

说我有:

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

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

delete foo;

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

请不要对此愚蠢的评论,我知道至少应该在这里使用自动指针。这种行为存在于我正在使用的代码库中,我可以在其中修复它。

2 个答案:

答案 0 :(得分:9)

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

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

这很容易测试,其中vector<T> 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

答案 1 :(得分:3)

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

(&amp; a) - &gt; ~X() - 析构函数应用于的每个元素;所有的记忆都被解除分配。

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