为何这段C++代码中的对象会被销毁两次?
为什么这段C++代码会输出两次"destroy"?
你的代码:
#include <iostream> #include <vector> class Obj { public: Obj() { std::cout << "build" << std::endl; } ~Obj() { std::cout << "destroy" << std::endl; } }; static std::vector<Obj> s = { Obj() }; int main() { return 0; }
运行输出:
build destroy destroy
原因解析
问题出在static std::vector<Obj> s = { Obj() };这一行的初始化逻辑:
- 首先,
Obj()会创建一个临时Obj对象,此时触发构造函数,输出build。 - 这个临时对象会被用来初始化vector中的元素(因为你没自定义拷贝构造函数,编译器会生成默认的拷贝构造,把临时对象的内容拷贝进vector)。
- 临时对象完成初始化vector的任务后,会被立即销毁,这是第一次输出
destroy。 - 程序正常结束时,静态vector
s会被销毁,它内部存储的那个Obj对象也会随之销毁,这是第二次输出destroy。
解决方法
如果想只触发一次构造和一次销毁,可以直接让vector在内部构造对象,避免临时对象的产生:
// 直接构造一个包含1个Obj元素的vector static std::vector<Obj> s(1);
这样运行后就只会输出:
build destroy
内容的提问来源于stack exchange,提问作者zRegle
相关产品推荐
相关产品推荐

