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

时间:2016-03-28 22:04:42

标签: c++ reference

出于演绎的原因,我编写了如下代码:

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;
}

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

2 个答案:

答案 0 :(得分:2)

  

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

在构造函数执行完毕后,您正在存储对不活动的对象的引用。您正在存储悬空参考。

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

name是堆栈中的变量。函数返回后它不存在。

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

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

答案 1 :(得分:1)

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

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

虽然我认为最好重新考虑一下你是否应该存储一个引用。它似乎没有多大意义。