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个列子 我貌似都没看懂,不知道为什么都不建议那个方法呢?
大家还有要讨论的么???可以继续加分。

解决方案 »

  1.   

    第一个例子,假设情况 :A线程在for途中,B线程 "Query1.Next;" 了一下,则 A线程 For 最后会内存错误。“while not Query1.Eof do” 则不会。第二个例子,貌似是为了保证 非局部变量的 Tx 实例 ,最多只有一个
      

  2.   

    第一个 循环里面.假设原先有10条数据,  RecordCount - 1 就是9循环就是从 0 .. 9循环的过程中可能会删除掉中间某一条或者几条数据.比如3 4 5 6这样 循环到 9的时候, 实际上就已经没有9了
      

  3.   


    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) 判断能得正确结果 
      

  4.   

    第二个 X 是个指针x 指向 Tx.Create 分配的内存地址(*****)x.free 就是释放这个内存地址. 虽然这一段内存已经释放了, 但是x 还是指向这一段内存.假设这一段内存又分配给了其他地方. 而在另一端代码中又读取了x.   这样就会造成未知的错误,并且很难被发现..
      

  5.   

    第一种对于 Query1的操作,eof是首选,访问count有可能引起其他类似越界的问题第二个,放置频繁Create造成内存浪费,所以可以先判断一下是否为空(当然可以使用单例模式解决此问题),释放时 x:= nil,也就是放置野指针的出现,free后并不等于已经是nil了,assigend(x)将无法判断是否可用,访问时可能会引起出错
      

  6.   

    RecordCount 依赖于打开数据集时的游标设置,RecordCount在特殊游标设置下可能返回-1,而实际上是有记录的,Delphi中,默认是有游标的设置,因此可以顺利的得到RecordCount,因为有可能不能正确反应数据,所以不推荐.而eof总是准确地反应情况。楼主可以尝试设置:CursorType的几个值来测试.而第2种段代码,只适用与全局变量或者类元素及它的方法中。
      

  7.   

    第二个,注释写的挺清楚了第一个,recordcount有些数据库控件,不一定支持的,或者需要花较大代价才能支持