Debug小错记录

Debug小错记录
flowwalkerDebug记录
注:记录自己在编程时犯的各种错误,以便未来快速编程(不痛哭流涕)
c++之OOP
1. C风格内存分配与“+1”原则
错误现象:
strcpy报错、输出乱码、字符串末尾出现奇怪字符。错误根源:忽略了 C 风格字符串的结束符
\0。⚠️ Debug 经验:
凡是使用
new char[len]存储字符串,必须改为new char[len + 1]。在填充完字符后,务必手动封口:
array[len] = '\0';。strlen
只能处理有\0` 结尾的字符串,否则会因越界而返回错误长度。
2. 构造函数不能 delete!
错误现象:程序刚运行就崩溃(Segmentation Fault)。
错误根源:在构造函数(包括拷贝构造)里使用了
delete。Debug 经验:
构造函数是对象的“出生”,此时成员指针
array里是随机垃圾值。绝对不能delete随机指针。拷贝构造函数中,直接
new即可;只有在operator=(赋值运算符)中,才需要先delete旧内存。习惯在构造函数初始化列表中将指针置为
NULL。
3. 赋值运算符(operator=)的“自杀”
错误现象:执行
a = a后,对象数据全部丢失或崩溃。错误根源:没有检查“自我赋值”。
Debug 经验:
在
delete自己的内存前,必须先判断if (this == &other) return *this;。忘记更新
length成员:在拷贝array的同时,务必同步更新所有的元数据(如length)。
4. 大数运算的“进位与对齐”
错误现象:计算结果出现前导零(如
013)或进位丢失(如9+1=0)。错误根源:逻辑过于复杂,进位(Carry)处理不统一。
Debug 经验:
⚠️ 统一存储方向:内部一律逆序存储(
array[0]是个位),(正序拷贝,逆序输入)只有在cout时才倒序输出。先算后存:先用一个
int数组或足够大的临时char数组处理完所有的sum和carry,最后再根据carry是否为 0 确定length。不要在循环内部直接改
length。
一个关于加法参考:
1 | friend CHugeInt operator+(const CHugeInt &a, const CHugeInt &b) { |
5. 运算符重载的“返回类型”陷阱
错误现象:加法结果无法传递,或者出现内存泄漏。
错误根源:
operator+返回了局部变量的引用(CHugeInt&)。Debug 经验:
⚠️
+必须返回对象值(CHugeInt),因为它产生的是一个临时的新值。+=
和++(前置)必须返回**引用**(CHugeInt&),即return *this;`,以支持链式操作。
6. C 风格字符串与指针的“老派”脾气
- 错误现象:
strcpy拷贝结果不对。 - 错误根源:数组名不能直接赋值,必须使用
memcpy或strcpy。 - Debug 经验:
- 如果已经知道确切长度,
memcpy通常比strcpy更安全。 - ⚠️ 在使用
tmp数组中转后,记得delete []tmp释放临时空间,防止内存泄漏。









