删除动态分配的向量会清除它的内容吗
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 的值,
假设我有:
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 的值,