var
  m:tmemorystream;
begin
  m:=tmemorystream.Create ;
  if m<>nil then
  showmessage('zai');
  m.Free ;
  if m<>nil then
  showmessage('free');
end;运行后,先出现zai对话框,表示m创建已存在,然后又出现free对话框,这是为什么?m不是已经释放了吗?为什么不为空呢?

解决方案 »

  1.   

    m.Free 改为
    FreeAndNil(m);
      

  2.   


    FreeAndNil(m);如果能先判断m是不是nil就更好了
      

  3.   

    m.Free; //这只是对指针m指向的那个对象进行析构操作,回收相应资源,但指针m的值仍然是一个非零地址(即不等于nil),只是这已经是一个非法地址,即它指向的对象已经不存在了
      

  4.   

    m.Free; //这只是对指针m指向的那个对象进行析构操作,回收相应资源,但指针m的值仍然是一个非零地址(即不等于nil),只是这已经是一个非法地址,即它指向的对象已经不存在了m只是一个指针,它的大小是4个字节,位于栈内存,调用它所属的过程时,它是一个随机值,当m:=TStream.Create;时,程序先是在堆内存构造一个TStream对象,然后把对象的地址赋值给m
      

  5.   

    var
      m:tmemorystream;//此时m的变量地址非nil,Pointer(m)为nil
    begin
      m:=tmemorystream.Create ;//Pointer(m)非nil
      if m<>nil then
      showmessage('zai');
      m.Free ;//Pointer(m)指向的对象被释放,但Pointer(m)非nil
      if m<>nil then
      showmessage('free');
    end;
      

  6.   

    9楼:
    var
      m:tmemorystream;//此时m的变量地址非nil,Pointer(m)为nil
    这句注释改为“此时m值为随机值,可能是nil,也可能不是nil ”更恰当一些。附:对象的名字就是一个指针procedure TForm1.Button3Click(Sender: TObject);
    var
      P: Pointer;
    begin
      P := TEdit.Create(Self);
      with TEdit(P) do begin
        Text := 'A Edit';
        Left := 50;
        Top := 50;
        //....
        Parent := Self;
        Show;
      end;
    end;
      

  7.   

    楼上的解释都对。
    反正记得 := nil 就行