浅谈delphi如何增加代码的健壮性

一剑飘雪 2012-06-11 09:57:38
delphi中如何提高程序运行的健壮性? 使用运行的程序不易死机等未知问题?
我贴上从其他地方看到的

var
I: Integer;
begin
Query1.First;
for I := 0 to Query1.RecordCount - 1 do begin //不建议//容易被影响.
Query1.Next;
{};
end;
/////
Query1.First;
while not Query1.Eof do begin //建议
{ }
Query1.Next;
end;
end;



vat x:Tx;
x:=Tx.Create; //不建议,x可能被多次创建
x.....
x.Free;//不建议,x还指向某处
////////
vat x:Tx;
if not assigend(x) then
x:=Tx.Create; //建议,x为nil时才创建
x.....
x.free;
x:=nil; //建议,释放后指向nil,或用FreeAndNil(x)代替以上两句

上面2个列子 我貌似都没看懂,不知道为什么都不建议那个方法呢?
大家还有要讨论的么???可以继续加分。
...全文
259 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
鐵蛋 2012-06-20
  • 打赏
  • 举报
回复
第一个例子,容易数组越界
第二个例子,保证Tx的实例只有一个
蓝色光芒 2012-06-11
  • 打赏
  • 举报
回复
RecordCount 依赖于打开数据集时的游标设置,RecordCount在特殊游标设置下可能返回-1,而实际上是有记录的,Delphi中,默认是有游标的设置,因此可以顺利的得到RecordCount,因为有可能不能正确反应数据,所以不推荐.而eof总是准确地反应情况。

楼主可以尝试设置:CursorType的几个值来测试.

而第2种段代码,只适用与全局变量或者类元素及它的方法中。
kaikai_kk 2012-06-11
  • 打赏
  • 举报
回复
尽可能的把各种可能出错的情况排除掉,加上优化,就是健壮的代码
7年 2012-06-11
  • 打赏
  • 举报
回复
楼上的几位说的真好!
bdmh 2012-06-11
  • 打赏
  • 举报
回复
第一种对于 Query1的操作,eof是首选,访问count有可能引起其他类似越界的问题

第二个,放置频繁Create造成内存浪费,所以可以先判断一下是否为空(当然可以使用单例模式解决此问题),释放时 x:= nil,也就是放置野指针的出现,free后并不等于已经是nil了,assigend(x)将无法判断是否可用,访问时可能会引起出错
爱蹄子的羊头 2012-06-11
  • 打赏
  • 举报
回复
第二个 X 是个指针

x 指向 Tx.Create 分配的内存地址

(*****)

x.free 就是释放这个内存地址. 虽然这一段内存已经释放了, 但是x 还是指向这一段内存.

假设这一段内存又分配给了其他地方.

而在另一端代码中又读取了x. 这样就会造成未知的错误,并且很难被发现..
mhhaifeng 2012-06-11
  • 打赏
  • 举报
回复

var
I: Integer;
begin
Query1.First;
for I := 0 to Query1.RecordCount - 1 do begin //不建议//容易被影响.
//如果RecordCount改变,会出错 线程安全
Query1.Next;
{};
end;

vat x:Tx;
if not assigend(x) then //防止已X指向有用数据
x:=Tx.Create; //建议,x为nil时才创建 x.....
x.free; //释放后X值可能不为nil 可能指向无效数据 如果再引用就麻烦
x:=nil; //建议,释放后指向nil,或用FreeAndNil(x)代替以上两句 assigned(x) 判断能得正确结果
专制的网站 2012-06-11
  • 打赏
  • 举报
回复
第一个例子,假设情况 :A线程在for途中,B线程 "Query1.Next;" 了一下,则 A线程 For 最后会内存错误。“while not Query1.Eof do” 则不会。

第二个例子,貌似是为了保证 非局部变量的 Tx 实例 ,最多只有一个
爱蹄子的羊头 2012-06-11
  • 打赏
  • 举报
回复
第一个 循环里面.

假设原先有10条数据, RecordCount - 1 就是9

循环就是从 0 .. 9

循环的过程中可能会删除掉中间某一条或者几条数据.比如3 4 5 6

这样 循环到 9的时候, 实际上就已经没有9了
haitao 2012-06-11
  • 打赏
  • 举报
回复
第二个,注释写的挺清楚了

第一个,recordcount有些数据库控件,不一定支持的,或者需要花较大代价才能支持
mhhaifeng 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

都谢 以上几位的
但是大家没有说自己对健壮性的了解与独特地方?
就像我这样举个例子这样
[/Quote]
就如你举的例子 尽可能考虑到或能会出现的错误,尽量减小出错的机会
即使偶尔出错程序也不至崩溃,能继续运行或提醒用户
具体的,就难以说清 只能是根据计算机系统运行的了解,自行把握
一剑飘雪 2012-06-11
  • 打赏
  • 举报
回复
都谢 以上几位的
但是大家没有说自己对健壮性的了解与独特地方?
就像我这样举个例子这样

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧