返回类成员引用变量会导致运行时错误

Returning a class member reference variable results in runtime error

本文关键字:运行时错误 变量 成员 引用 返回      更新时间:2023-10-16

由于演绎的原因,我写了一个代码如下:

class Bike
{
public:
    Bike(std::string name) : m_name(name) {}
    std::string& getName() const { return m_name; }
private:
    std::string& m_name;
};
int main() {
    string name("Trek");
    Bike bike(name);
    string& ref1 = name;
    string& ref2 = ref1;
    string& ref3 = bike.getName(); // <Error reading characters of string> why?
    cout << ref1 << endl; // ok
    cout << ref2 << endl; // ok too
    cout << ref3 << endl; // Boom. runtime error
    return 0;
}

有人能解释一下这种行为背后的原因吗?

有人能解释一下这种行为背后的原因吗?

您正在存储对一个对象的引用,该对象在构造函数完成执行后不活动。您正在存储一个悬空引用。

Bike(std::string name) : m_name(name) {}
                 ^^^^^

name是堆栈上的一个变量。函数返回后,它不活动。

为了具有有效的引用,必须通过引用传递Bike()的参数。

Bike(std::string& name) : m_name(name) {}
                ^^

构造函数按值获取字符串。因此,它是函数的本地副本。该字符串在函数末尾被销毁,从而使对它的引用无效。如果你想在对象中存储对字符串的引用(你真的确定要这样做吗?),那么你需要确保该字符串的使用寿命超过引用的使用寿命。您可以通过将构造函数参数更改为引用来实现这一点。

Bike(std::string& name) : m_name(name) {}

尽管我认为最好重新考虑一下你是否应该首先存储一个参考。这里似乎没有多大意义。