You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段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。
  • 程序正常结束时,静态vectors会被销毁,它内部存储的那个Obj对象也会随之销毁,这是第二次输出destroy。

解决方法

如果想只触发一次构造和一次销毁,可以直接让vector在内部构造对象,避免临时对象的产生:

// 直接构造一个包含1个Obj元素的vector
static std::vector<Obj> s(1);

这样运行后就只会输出:

build
destroy

内容的提问来源于stack exchange,提问作者zRegle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:22:08