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

C++重载运算符方法内调用成员方法出现异常输出问题排查

问题核心原因

你的operator+=重载函数的第一个参数采用了值传递,导致每次调用时都会生成原对象的临时拷贝,所有修改操作都作用在临时对象上,不会影响原buf对象。

  • 你当前operator+=的定义为void operator+=(IntBuf buf, int val),第一个参数buf是值传递,调用buf += 34时,会调用IntBuf的默认拷贝构造函数生成一个临时副本,函数内部调用Add修改的是这个副本的length_和values_指向的内存内容。
  • 函数执行结束后临时副本就销毁了,原对象的length_从来没有被修改过,始终保持初始值0,所以最后调用ToString输出就是空数组[]。
  • 两次operator+=调用时打印的current length都是0,是因为两次调用分别拷贝了初始状态的原对象,两次操作的是完全独立的两个临时副本,所以每个副本的初始length_都是0。

修复方案

把operator+=的第一个参数改成左值引用即可,修改后的声明和实现如下:

// 头文件声明修改
void operator+=(IntBuf& buf, int val);

// 实现修改
void operator+=(IntBuf& buf, int val) {
    buf.Add(val);
}

其他代码隐患

  1. 你写的IntBuf buf = *new IntBuf(10);存在内存泄漏:new出来的堆对象在拷贝给栈上的buf之后,没有被delete,永远无法回收。正确写法应该是直接栈上构造:IntBuf buf(10);
  2. IntBuf类没有自定义拷贝构造函数和析构函数,默认拷贝构造是浅拷贝,会导致多个对象共享同一块values_指向的堆内存,对象销毁时会出现double free的问题,建议补充对应实现:
// 析构函数
~IntBuf() {
    delete[] values_;
}
// 拷贝构造函数(如果需要拷贝语义)
IntBuf(const IntBuf& other) {
    capacity_ = other.capacity_;
    length_ = other.length_;
    values_ = new int[capacity_];
    memcpy(values_, other.values_, length_ * sizeof(int));
}
// 拷贝赋值运算符
IntBuf& operator=(const IntBuf& other) {
    if (this == &other) return *this;
    delete[] values_;
    capacity_ = other.capacity_;
    length_ = other.length_;
    values_ = new int[capacity_];
    memcpy(values_, other.values_, length_ * sizeof(int));
    return *this;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:36:03