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
相关产品推荐
相关产品推荐

