返回类成员引用变量会导致运行时错误
Returning a class member reference variable results in runtime error
由于演绎的原因,我写了一个代码如下:
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) {}
尽管我认为最好重新考虑一下你是否应该首先存储一个参考。这里似乎没有多大意义。
相关文章:
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 在同一模拟中使用静脉和静脉_ inet内容时出现运行时错误
- 对单向链表进行排序时出现运行时错误
- 为什么此代码存在运行时错误?
- 你能解释一下什么运行时错误是如何解决它的吗?
- 运行时错误,变量 B 未初始化
- 运行时错误,使用未声明的变量,C++
- 从成员变量更新类变量或调用类功能是给出运行时错误
- 循环和运行时错误中的C 变量声明
- 返回类成员引用变量会导致运行时错误
- C++指针运行时错误 - 使用指针设置变量然后检索
- 如何更正运行时错误变量周围的堆栈已损坏
- 具有变量参数的函数运行时错误
- 访问指针类成员变量c++时发生运行时错误
- 运行时错误-变量arr_processes周围的堆栈已损坏
- 将变量移动到头文件时出现运行时错误
- 运行时错误 - C++ 运行时检查失败 #2 - 变量"theArray"周围的堆栈已损坏
- 列出库中的变量导致运行时错误,原因