You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 04:15:57