[关闭]
@nrailgun 2017-10-05T20:39:47.000000Z 字数 616 阅读 1269

程序除错技巧

程序设计


总体原则

经常使用断言

使用 Assert 是一个好的想法,运行过程中出现错误可以帮助快速定位。

编写简单的测试代码

TODO:掌握一个简单的测试工具🔧。

使用小数据避免维度诅咒

数据维度大的时候排除错误很困难,建议使用数据中的一小部分输出观察结果。另外的好处是许多针对大数据的程序没有处理好小数据的边界,这样容易发现错误。

边界控制

边界控制是程序设计易错部分,不过我个人总结出了一些技巧。

拓展边界

某些情况下,数组需要检查是否操作位置超出了边界,需要拓展数组。技巧是,检查数组尺寸是否大于操作位置,因为尺寸总是大于下标:

  1. if (nint > i + 1)
  2. a[i + 1] = var;

相反地,如果过界就是:

  1. if (nint <= i + 1)
  2. a = realloc(N);

uint32_t 的边界

  1. while (i <= size - 1) {

  1. while (i < size) {

这两者是不同的,在内存管理中,出现 size = 0xffffffff + 1 是比较常见的,数值上为 0,但是真正的意思是 0x100000000,使用形式 2 会导致判断永远失败。

防范溢出

建议使用动态内存的时候,使用显眼的变量明明其长度,并在 access 的时候使用 assert(i >= 0 && i < N)

复杂的类

小心互相依赖的类的析构函数

互相依赖的类型的析构函数特别麻烦,必须小心。
例如:类型 A 包含了数据成员 vector<B>,但是 B 的析构函数依赖于 A,那么你必须手动在 ~A() 中调用 vector<B>::clear()

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注