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

8

假设我有以下内容:

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

我向它添加了很多东西,使用后只需调用:
delete foo;

我需要先调用foo.clear();吗?还是delete会调用析构函数。

请不要对这种做法提出批评,我知道至少应该使用自动指针来代替。但这是我所在代码库中的行为,超出了我的修改范围。


3
使用vector<T>进行测试非常简单,其中T在销毁时向std::cout输出。 - Lightness Races in Orbit
一旦你删除了它,为什么还要在意它是否已经被清除? - Fantastic Mr Fox
1
@Ben 他可能会担心包含对象的析构函数是否被调用。 - KABoissonneault
2
@Ben:这样你就不会出现内存泄漏,或者其他因元素销毁失败而产生的不良影响了。为什么你不会关心呢? - Lightness Races in Orbit
@JonathanMee:好的,完成了。谢谢! - Lightness Races in Orbit
显示剩余4条评论
2个回答

9
是的,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
}

演示链接


3
根据容器的要求(C++标准,表格96-容器要求),(&a)->~X() - 应用析构函数到a中的每个元素;所有内存都被释放。其中X表示包含类型为T的对象的容器类,a和b表示类型为X的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接