C++类引用成员初始化不当导致输出垃圾值问题求助
问题分析与修复方案
嘿,我一眼就揪出你代码里的问题啦!
核心错误原因
你的构造函数参数是按值传递的 int in,这意味着当你调用 Referencer ref(longlived); 时,longlived 的值会被拷贝到临时参数 in 中。而你的引用成员 num 绑定的是这个临时的参数 in,不是 longlived 本身!
当构造函数执行完毕后,这个临时参数 in 就会被销毁,此时 num 就变成了悬空引用——指向一块已经被释放的内存。这时候调用 print() 访问它,输出垃圾值也就不奇怪了,没触发段错误只能说运气比较“好”(或者说不好,因为没直接报错让你快速定位问题)。
修复后的代码
只需要把构造函数的参数改成引用类型,让它直接绑定到传入的变量上就行:
#include <iostream> struct Referencer { // 参数改为引用类型,确保绑定到原变量 explicit Referencer(int& in) : num(in) {} void print() { std::cout << num << std::endl; } int # }; int main() { int longlived = 500; Referencer ref(longlived); ref.print(); // 现在会正确输出500 }
额外提示
如果你的引用成员不需要修改原变量,可以把参数和成员都改成 const int&,这样还能支持绑定到临时值(不过这里你用的是长期存在的变量,所以非const引用也完全没问题)。
内容的提问来源于stack exchange,提问作者ShnitzelKiller
相关产品推荐
相关产品推荐

