关于C++局部类引用成员管理的疑问:垃圾值是否源于悬垂引用?
问题分析与结论
你的判断存在细节偏差,真正导致垃圾值的原因并非外部局部对象o提前超出作用域,而是Inner构造函数采用值传递参数,使得引用成员绑定了临时对象,具体逻辑如下:
- Inner的构造函数
Inner(Other o)是值传递方式,当执行Inner i(o);时,会生成一个Other类型的临时拷贝对象作为构造函数的参数。 - Inner的引用成员
m_o绑定的是这个临时参数对象,而非外部的局部变量o。 - 临时参数对象会在Inner构造函数执行完成后立即销毁,此时
m_o就变成了悬垂引用,指向已被释放的内存空间。 - 后续调用
i.get_other_value()时,访问的是已销毁对象的成员j,这属于C++中的未定义行为,因此会输出随机垃圾值。
外部的局部变量o会在get_a_value函数执行完毕后才销毁,它的生命周期覆盖了Inner对象的整个存在时间,所以不是它引发的问题。
修正方案
将Inner构造函数的参数改为引用传递,即可绑定外部的局部对象o,避免悬垂引用:
Inner(const Other& o) : m_o(o) { // ... 原有构造函数代码 }
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

