说我有:
vector<string>* foo = new vector<string>();
我添加了大量的东西,使用它,然后我只是打电话:
delete foo;
我是否需要先致电foo.clear();
?或者delete
会调用析构函数。
请不要对此愚蠢的评论,我知道至少应该在这里使用自动指针。这种行为存在于我正在使用的代码库中,我可以在其中修复它。
答案 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
}
答案 1 :(得分:3)
根据容器的要求(C ++标准,表96-容器要求)
(&amp; a) - &gt; ~X() - 析构函数应用于的每个元素;所有的记忆都被解除分配。
其中X表示包含T类型对象的容器类,a和b表示类型X的值,