C++类内部使用基类引用出现异常值问题求助
C++引用成员变量导致的未定义行为分析
你的代码核心问题出在base类的引用成员变量绑定到了临时变量上,引发了未定义行为,导致输出随机垃圾值。
问题根源
看base类的构造函数和成员定义:
class base { public: explicit base(int val) : myVar(val) { std::cout << "base class constructor" << std::endl; } private: int &myVar; };
构造函数的参数val是值传递,这意味着它是传入的10的一个临时副本,仅在构造函数执行期间存在。而myVar是引用类型,被初始化绑定到这个临时的val上。当构造函数执行完毕,这个临时的val会被销毁,myVar就变成了悬垂引用——指向一块已经被释放的内存。
后续对myVar的所有访问(比如getVal())都是在访问无效内存,这属于C++标准中的未定义行为,输出结果是随机的(你看到的32767就是典型的垃圾值)。
第一次输出newBase.getVal()得到10只是巧合,此时临时变量的内存还没被其他数据覆盖,但这完全不可靠,不属于预期行为。
解决方案
有两种常见的修复方式:
1. 将引用成员改为普通成员变量
如果不需要myVar作为引用,直接改成普通int类型,让base类自己持有这个值:
class base { public: explicit base(int val) : myVar(val) { std::cout << "base class constructor" << std::endl; } ~base() { std::cout << "base class destructor" << std::endl; } int getVal() { return myVar;} private: int myVar; // 去掉引用修饰符 };
这种方式最直接,避免了引用带来的生命周期问题。
2. 让引用绑定到生命周期足够长的变量
如果必须使用引用,需要确保myVar绑定的变量生命周期不短于base对象。修改构造函数为接收引用参数:
class base { public: explicit base(int &val) : myVar(val) { // 参数改为int& std::cout << "base class constructor" << std::endl; } ~base() { std::cout << "base class destructor" << std::endl; } int getVal() { return myVar;} private: int &myVar; }; // main函数中调整为: int main() { int val = 10; // 生命周期覆盖整个main函数 base newBase(val); std::cout << "Hello trial from base : " << newBase.getVal() << std::endl; someClass newSome(newBase); std::cout << "Hello trial from base again after new class obj creation : " << newBase.getVal() << std::endl; std::cout << "Hello trial from new class : " << newSome.helloBase.getVal() << std::endl; return 0; }
这样myVar绑定到main中的val,其生命周期和newBase一致,不会出现悬垂引用问题。
内容的提问来源于stack exchange,提问作者meetanandkr
相关产品推荐
相关产品推荐

