C++嵌套类示例中析构函数被调用两次是什么原因?
问题原因分析
- 你统计构造调用次数时只统计了自定义的无参构造函数,漏掉了编译器为类自动生成的拷贝构造函数的调用,这是你看到构造和析构次数不对等的核心原因。
- 问题出在
printnumber函数的参数传递规则:
你的函数定义为void printnumber(enclose p),参数采用值传递方式。当你在main函数中调用example.nested.printnumber(example)时,会将实参example拷贝生成一个新的临时enclose对象作为形参p,这个拷贝过程调用的是C++编译器隐式生成的默认拷贝构造函数,你没有为该函数添加打印逻辑,自然看不到这次构造的输出。 - 你看到的两次析构分别对应两个完全构造完成的对象:
- 第一次析构对:
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
相关产品推荐
相关产品推荐

