obj = record
    id : integer;
    pid : integer;
  end;
  pobj = ^obj;  Data : Pointer; //一个全局变量
procedure btn1(sender : TObject) ;
var
  obj1 : pobj ;
begin
  if Assigned(Data) then
  begin
    FreeMem(Data); //出错。。要不要这一句,如果不要会不会发生内存泄露
  end;
  GetMem(obj1);
  obj1.id := 1;
  obj1.pid := 2;
  Data := obj1;
endbtn1这个过程我要调用多次,给Data赋值时,先前的占用的内存应该怎样释放?我这样写为什么会出错?

解决方案 »

  1.   

    用New创建的指针,使用Dispose释放。
    type  Str18 = string[18];
     var
      P: ^Str18;
    begin
      New(P);
      P^ := 'Now you see it...';
      Dispose(P); { Now you don't... }
    end;
    用GetMem得到的,释放用FreeMem。
    var  F: file;
      Size: Integer;
      Buffer: PChar;
    begin
      AssignFile(F, 'test.txt');
      Reset(F, 1);
      try
        Size := FileSize(F);
        GetMem(Buffer, Size);
        try
          BlockRead(F, Buffer^, Size);
          ProcessFile(Buffer, Size);
        finally
          FreeMem(Buffer);
        end;
      finally
        CloseFile(F);
      end;end;
      

  2.   

    Record的用New和Dispose的
    PCHar/Array才使用GetMem和FreeMem的不要用错http://lysoft.7u7.net
      

  3.   

    Record的用New和Dispose的
    PCHar/Array才使用GetMem和FreeMem的
      

  4.   

    动态分配内存的函数是GetMem(),与之对应的释放函数为FreeMem()(传统Pascal中获取内存的函数是New()和 Dispose(),但New()只能获得对象的单个实体的内存大小,无法取得连续的存放多个对象的内存块)。
      

  5.   


    将 FreeMem(Data); 改为 Dispose(Data);
      

  6.   

    将 FreeMem(Data); 改为 Dispose(Data);
      

  7.   

    没别的说的了,New创建,Dispose释放
      

  8.   

    程序结构设计就有严重问题,思路就比较混乱。这样的思路把程序写出来,不出错也搞个内存泄漏出来。没有释放指针这一说,释放的是指针指向地址的堆内存。内存释放后要把指针的值赋为0,也就是nil/null,因为该地址指向内存已经释放。Assigned的作用就是判断指针的值是否为nil,你释放内存后没有将值改为nil,自然造成混乱。>>Record的用New和Dispose的
    >>PCHar/Array才使用GetMem和FreeMem的没有这种要求,区别只是在于GetMem可以用于分配N个单元的连续内存。
      

  9.   

    另外还有一个问题,Pointer是无类型指针明白吗?改成Data: PObj;最后一点,写程序,变量,类型命名别太随意了。你这样的风格很容易和和关键字什么的发生冲突。