删除动态分配的向量会清除它的内容吗

Does Deleting a Dynamically Allocated Vector Clear It's Contents

假设我有:

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

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

delete foo;

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

请不要评论这个愚蠢的行为,我知道至少应该在这里使用自动指针。此行为存在于我正在使用的代码库中,超出了我修复它的范围。

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

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

这很容易测试,使用 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)

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

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

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