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
相关产品推荐
相关产品推荐

