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

C++嵌套类示例中析构函数被调用两次是什么原因?

问题原因分析
  1. 你统计构造调用次数时只统计了自定义的无参构造函数,漏掉了编译器为类自动生成的拷贝构造函数的调用,这是你看到构造和析构次数不对等的核心原因。
  2. 问题出在printnumber函数的参数传递规则:
    你的函数定义为void printnumber(enclose p),参数采用值传递方式。当你在main函数中调用example.nested.printnumber(example)时,会将实参example拷贝生成一个新的临时enclose对象作为形参p,这个拷贝过程调用的是C++编译器隐式生成的默认拷贝构造函数,你没有为该函数添加打印逻辑,自然看不到这次构造的输出。
  3. 你看到的两次析构分别对应两个完全构造完成的对象:
  • 第一次析构对:printnumber函数执行完毕后,形参p这个临时对象生命周期结束,先触发enclose类析构,再触发其内部nested成员的析构,对应输出里前两行析构日志。
  • 第二次析构对:main函数执行完毕后,你显式定义的example对象生命周期结束,同样触发enclose类析构和其内部nested成员的析构,对应输出里后两行析构日志。

验证方案

你可以手动为enclose类添加拷贝构造函数并添加打印,就能看到对应的构造调用,和析构次数匹配:

// 类内声明拷贝构造
enclose(const enclose& other);
// 类外实现
enclose::enclose(const enclose& other)
{
    std::cout << "Enclosed class copy constructor called" << std::endl;
    this->x = other.x;
}

补充后运行代码,你会看到额外的拷贝构造日志,构造总次数和析构总次数会完全对应。

注意:这个问题和嵌套类的特性无关,属于C++值传递的默认拷贝规则导致的现象,不需要排查嵌套类相关的语法逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:54:03