我应该为我的计数类成员使用无符号整数吗?
回答
例如,假设一个类
TList <T> = class
private
FCount : Cardinal;
public
property Count : Cardinal read FCount;
end;
这确实有道理,不是吗?存储在列表中的项目数不能为负数,那么为什么不使用无符号整数类型呢?我认为总是尽可能使用最不通用(因此最特殊)的类型通常是一个很好的原则。
现在,遍历列表如下所示:
for I := 0 to List.Count - 1 do
Writeln (List [I]);
当列表中存储的项目数为零时,编译器会尝试评估
List.Count - 1
这导致了一个很好的整数溢出(确切地说是下溢)。结合调试器没有显示发生异常的适当位置的事实,这对我来说很难找到。
让我补充一点,如果您关闭了溢出检查,那么由此产生的错误将更难跟踪,因为您将经常访问不属于您的内存 - 这会导致未定义的行为。
从现在开始,我将为我的所有计数成员使用纯整数,以避免这种情况。
如果这完全是胡说八道,请指出来给我:)
(我只花了一个小时跟踪我的代码中的整数溢出,所以我决定分享一下——当然,这里的大多数人都知道,但也许我可以节省一些时间。)