定义一个内存指针;在Getmem为其分配内存之前使用或者释放都可能造成比较严重的问题;
所在我想在使用或者释放以前都加个判断;譬如
if P <> nil and (not ssigned(P) ) then
begin
  freemem(P); 
  FreeAndNil(P);
end;但,上面两个判断条件都没有挡住;在我没有执行GetMem的情况下;
依然可以执行到FreeMem;
然后就报错了。

解决方案 »

  1.   


    if not Assigned(P) then
      FreeMen(P);
    就行了。。
      

  2.   

    补充一下
    P先初始为nil 即p:=nilFreeAndNil 只用于类对象
      

  3.   

    to GARNETT2183(KingWolves (http://kevin-lu.blogspot.com)) 
    if not assigned(P) then判断仍然执行了。
      

  4.   

    就是说,你只要定义了一个指针对象;
    那么用assigned就可以检测到。
      

  5.   

    p要先初始为nil例如:
    var
      p:PChar;
    begin
      p:=nil;  //do somthing, getmem or not  if Assigned(p) then FreeMem(p);
      

  6.   

    Assigned的功能是检测一个过程变量或者过程指针是否为0;
    Assigned(P)对于指针变量相当于 P<>nil
    对于过程变量相当于@P <> nil 用函数测试如下
    var
    P:pointer;
    begin
      p:= nil;
      if not Assigned(P) then
        Edit1.Text := 'P is Nil.';
      GetMem(p,1024);{p有效}
      FreeMem(p,1024); {p不再有效且非空}
      if Assigned(P) then
        Edit2.Text := 'P is Not Nil.';
    end;执行结果如下:
      P is nil;
      P is not Nil.
    就是说,FreeMem过程执行后Assigned(P)依然可以检测到;我想知道的是,怎么能检测到当前指针p是否有效?
    end;
      

  7.   

    to HsWong() 
    定义完先初始化是个好注意;可行;谢谢了。还有新招没?