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

C++自定义STRING类运算符重载疑问:char*正常char运算异常

问题原因分析

1. M3 = M1 + " und " + M2能运行的原因

你虽然只重载了接受STRING类型参数的operator+,但C++允许隐式类型转换:" und "是const char*类型,只要你的STRING类定义了STRING(const char*)构造函数(能运行说明该构造函数存在),编译器会自动把const char*转换成临时STRING对象,从而符合operator+的参数要求。整个表达式执行逻辑是:

  • 先将" und "转为STRING,执行M1 + 临时STRING得到新的STRING对象
  • 再将这个新对象与M2相加,最终赋值给M3

2. M3 = M1 + 'D' + M2编译通过但运行崩溃的原因

编译通过是因为你定义了STRING(char)构造函数,'D'会被隐式转成STRING对象,满足operator+的参数要求。但运行崩溃大概率是operator+的实现存在问题,最常见的两种情况:

  • operator+返回引用而非值:如果你的operator+是成员函数且返回类型为STRING&,那么M1 + 'D'生成的临时STRING对象会在子表达式结束后被销毁,返回的引用会变成悬空引用。后续用这个悬空引用和M2相加时,会访问已释放的内存,触发未定义行为(比如崩溃、无输出)。
  • 内存管理逻辑错误:比如拼接字符串时未正确计算所需内存大小、未分配足够空间,或者拷贝构造函数/析构函数存在内存泄漏、重复释放等问题,导致临时对象的内存操作异常。

解决时优先检查operator+的返回类型,应返回STRING值而非引用;其次排查字符串拼接的内存分配与初始化逻辑。

内容的提问来源于stack exchange,提问作者Ummel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:36:09