gpt4 book ai didi

c++ - 为什么析构函数在对象被删除之前运行

转载 作者:行者123 更新时间:2023-11-30 00:45:53 25 4
gpt4 key购买 nike

当我运行这段代码时,析构函数在对象移除之前启动。

代码在这里:

#include <string>
#include <vector>

using namespace std;

class Testi {
public:

string name;
Testi(string a) : name(a) {
cout << "Im alive: " << name << endl;
}
~Testi() {
cout << "Im no longer alive: " << name << endl;
}

};
int main() {

vector <Testi> a;

a.push_back(Testi("John"));
a.push_back(Testi("Jack"));
a.push_back(Testi("Jake"));

cout << a[1].name;

cin.get();
return 0;
}

当我运行程序输出是:

Im alive: John
Im no longer alive: John
Im alive: Jack
Im no longer alive: John
Im no longer alive: Jack
Im alive: Jake
Im no longer alive: John
Im no longer alive: Jack
Im no longer alive: Jake

Jack

输入后:

Im no longer alive: John
Im no longer alive: Jack
Im no longer alive: Jake

所以在每次 push_back() 之后,所有的析构函数都会运行。输出操作运行良好,因此对象仍然存在。对于第一个析构函数运行 4 次!为什么?

最佳答案

相关代码如下:

vector <Testi> a;
a.push_back(Testi("John"));
  1. Testi("John") 创建一个新的临时 Testi 对象。
  2. push_back 将该对象复制到 vector 中。
  3. 然后删除临时对象。

因此意外的构造函数和析构函数调用来自临时对象的创建和删除。您可以使用 emplace_back 避免额外的临时对象和拷贝,这将直接在 vector 中构造对象。

关于c++ - 为什么析构函数在对象被删除之前运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41025053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com