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

Jon*_*Mee 8 c++ destructor vector clear dynamic-allocation

说我有:

vector<string>* foo = new vector<string>();
Run Code Online (Sandbox Code Playgroud)

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

delete foo;
Run Code Online (Sandbox Code Playgroud)

我需要先打个电话foo.clear();吗?或者将delete调用析构函数.

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

Lig*_*ica 9

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

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

这是很容易测试,与vector<T>在那里Tstd::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
}
Run Code Online (Sandbox Code Playgroud)

(现场演示)