【发布时间】:2022-01-23 16:49:12
【问题描述】:
我是 C++ 新手,所以有一个问题。
有C++代码:
class Test
{
public:
std::string name;
Test(){};
Test(std::string name) {
std::cout << "Create " << name << '\n';
Test::name = name;
};
~Test() {std::cout << "Destroy " << name << '\n';}
};
std::vector<Test> test {Test("one"), Test("two"), Test("three")};
void main()
{
for (auto i : test)
std::cout << i.name << '\n';
std::cout << "Clear\n";
test.clear();
}
这是输出:
Create one
Create two
Create three
Destroy three
Destroy two
Destroy one
one
Destroy one
two
Destroy two
three
Destroy three
Clear
Destroy one
Destroy two
Destroy three
为什么编译器会多次销毁向量中的对象,什么时候必须销毁一次?这段代码有什么问题?
使用默认选项编译 Microsoft cl.exe x64。
【问题讨论】:
-
你没有计算循环中创建的副本
-
添加一个也打印消息的复制构造函数。
-
当您尝试控制创建和销毁时,您应该始终显示
this的值,因为编译器可以生成和使用复制或移动析构函数。拥有this是了解实际销毁的对象的唯一万无一失的方法。 -
几乎重复:stackoverflow.com/questions/28716209/… 它不是最新的,但足以应付这种情况
-
好吧,实际上我认为答案是最新的
标签: c++ destructor