为何C++类无法持有const char字符串的引用?背后原理解析
问题:传入C风格const字符串时类中引用失效的原因
以下是测试代码:
class has_a_str_ref { const string& str; public: has_a_str_ref(string const& s) : str(s) {} void show() { std::cout << str << std::endl; } }; int main() { const char* s = "abc"; // const char s[] = "abc"; // 同样失效 // string s = "abc"; // 正常工作 has_a_str_ref x(s); std::cout << s << std::endl; x.show(); std::cout << s << std::endl; return 0; }
注:使用
-fsanitize=address编译
请问这背后发生了什么?
原因分析
- 临时对象的生命周期限制:当传入
const char*或const char[]类型的C风格字符串时,编译器会自动创建一个临时std::string对象,用来匹配构造函数的const std::string&参数。但这个临时对象的生命周期极短——仅在构造函数调用的表达式(即has_a_str_ref x(s);这一行)执行完毕后就会被立即销毁。 - 悬空引用的产生:类成员
const std::string& str绑定的正是这个已销毁的临时对象。后续调用x.show()时,引用指向的内存已经被释放,此时访问属于未定义行为,会出现引用失效、输出乱码甚至内存报错(-fsanitize=address工具就是用来检测这类内存非法访问的)。 - 直接传
std::string正常的原因:如果传入的是提前创建好的std::string对象,引用会绑定到这个生命周期和main函数变量一致的对象上,不会提前被销毁,因此引用始终有效。
内容的提问来源于stack exchange,提问作者Pluveto
相关产品推荐
相关产品推荐

