如何修复largeIntegers大整数类重载+运算符出现的段错误问题
问题原因
- 核心触发段错误的问题:
operator+重载函数返回了局部对象的引用。函数内定义的temp是栈上的局部变量,函数执行结束后对应的栈内存会被系统回收,返回的引用会变成悬垂引用,后续执行num3 = num1 + num2时访问已经被释放的非法内存,直接触发段错误。 - 不符合题目要求的问题:你没有按照题目要求重载赋值运算符
operator=,当前使用编译器默认生成的浅拷贝逻辑,虽然类内的固定大小栈数组暂时不会触发问题,但如果后续调整为动态存储结构会直接出错,也不符合题目设计要求。 - 功能不完善问题:当前加法逻辑仅支持两个正整数相加,没有处理符号判断,无法支持负数运算,但该问题不会触发段错误。
修复方案
1. 修改加法运算符的返回值类型
将operator+的返回值从引用类型改为值类型,直接返回局部对象即可,不要返回引用:
// 类内声明修改为 largeIntegers operator+(largeIntegers &); // 类外实现修改为 largeIntegers largeIntegers::operator+(largeIntegers &integer) { largeIntegers temp; temp.isPositive = isPositive; int remainder = 0; int digi = max(digits, integer.digits); temp.digits = digi; for (int i = 0; i < digi; i++) { temp.num[i] = (remainder + num[i] + integer.num[i]) % 10; remainder = (remainder + num[i] + integer.num[i]) / 10; } // 增加边界判断,防止超过100位数组越界 if (remainder && digi < 100) { temp.num[digi] = remainder; temp.digits++; } return temp; }
2. 补充重载赋值运算符
按照题目要求实现深拷贝赋值逻辑:
// 类内添加声明 largeIntegers& operator=(const largeIntegers &); // 类外实现 largeIntegers& largeIntegers::operator=(const largeIntegers &other) { if (this == &other) return *this; digits = other.digits; isPositive = other.isPositive; memset(num, 0, sizeof(num)); for (int i = 0; i < digits; i++) { num[i] = other.num[i]; } return *this; }
可选功能补充
如果需要支持正负整数的加减运算,只需要在operator+和后续实现的operator-中先判断两个操作数的符号,转换为对应的加法或绝对值减法逻辑,再设置结果的符号即可。
内容的提问来源于stack exchange,提问作者Parminder Singh
相关产品推荐
相关产品推荐

