obj = record
  id : integer;
  name : String;
end;
1:
var
 obj1 : obj;
obj1.id=1;
obj1.name='22';
flowchart.Data = @obj;
2:
if assigned(flowchar.Data) then
begin
  FreeMem(flowchar.Data); //出错
  flowchar := nil;
end;
我应该怎样释放flowchar.Data指针
  if

解决方案 »

  1.   

    应该不用释放,把FreeMem(flowchar.Data);去掉。obj应该是在栈中,过了生存期是可以自动释放的。
      

  2.   

    说说资源的释放当用GetMem 申请资源的时候,首先是系统在堆里开辟一段内存,然后把这段内存的首地址放到指针里面。指针其实就是一个32位的内存单元。那么,FreeMem 呢?它就直接把指针所指向的那段内存释放掉了。注意:这个过程并不承诺帮你把指针清零,也就是说它确实还指向一个地址,那个地址是存在的,尽管那个空间已经被释放掉了。所以Assigned(p)事实上返回的还是True。Assigned 是指派的意思,就是说指针是不是确实指向了一个地址。所以Assigned(p)其实和(p=nil) 是一个意思。所以,请注意:假如你希望Assigned(p) 有效的话,必须保证p 在不指向一个有效地址的时候一定被赋为nil。比如FreeMem(p); 之后一定要跟一个p := nil;顺便说一下,在函数的结尾假如FreeMem(p);之后马上跟一个p := nil;,常常会导致一个编译器警告,说是对变量赋值但是没有使用,所以后来的Delphi 里面就提供了一个FreeAndNil()的procedure,以便避免这样的警告。所以,推荐大家使用在释放内存的时候使用这个procedure。
      

  3.   

    不需要释放
    而且flowchart.Data = @obj;不好,flowchart.Data指向即将被自动释放的内存这样:
    var
     obj1 : ^obj;getmem(obj1,sizeof(obj));
    obj1^.id=1;
    obj1^.name='22';
    flowchart.Data = obj;
      

  4.   

    根本不是动态建立的,谈何释放?http://lysoft.7u7.net