假设我有以下内容:
vector<string>* foo = new vector<string>();
我向它添加了很多东西,使用后只需调用:
delete foo;
我需要先调用foo.clear();
吗?还是delete
会调用析构函数。
请不要对这种做法提出批评,我知道至少应该使用自动指针来代替。但这是我所在代码库中的行为,超出了我的修改范围。
假设我有以下内容:
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
}
vector<T>
进行测试非常简单,其中T
在销毁时向std::cout
输出。 - Lightness Races in Orbit