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); }
其他代码隐患
- 你写的
IntBuf buf = *new IntBuf(10);存在内存泄漏:new出来的堆对象在拷贝给栈上的buf之后,没有被delete,永远无法回收。正确写法应该是直接栈上构造:IntBuf buf(10); 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
相关产品推荐
相关产品推荐

