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

C++析构函数调用时机咨询:针对给定代码的疑问

代码分析与析构时机说明

先看这段C++代码:

#include <memory> 
#include <iostream>

class Token { public:
  Token() { std::cout << "Token()"; }
  ~Token() { std::cout << "~Token()"; }
};

template <class T> 
std::unique_ptr<T> foo(T t0) {
    return std::unique_ptr<T>(new T(t0)); };

int main() {
    Token&& t = Token();
    auto ptr = foo<Token>(t); 
    return 0;
}

析构函数的调用时机:

  • 第一个析构:foo函数的参数t0
    调用foo<Token>(t)时,因为参数是值传递,会用t绑定的临时对象拷贝构造出t0。当foo函数执行完成返回后,t0离开自身作用域,触发析构函数。

  • 第二个析构:被右值引用t绑定的临时对象
    这里要纠正你的初始判断:C++标准规定,当右值引用绑定到临时对象时,临时对象的生命周期会被延长至该引用变量的生命周期结束。也就是说Token()创建的临时对象不会立即析构,而是等到main函数中t的作用域结束(return 0执行前)才会触发析构。

  • 第三个析构:unique_ptr管理的堆对象
    foo函数中通过new T(t0)创建的堆对象被unique_ptr持有,当main函数结束时,ptr离开作用域,unique_ptr自动释放所管理的对象,触发该对象的析构函数。

补充说明:原代码未显式定义拷贝构造函数,编译器会生成默认拷贝构造函数,因此拷贝t0和堆对象时没有输出,但这些对象确实被创建,对应的析构也会正常触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:10:28