function createMemArea():pointer;
var
  strList:TStringList;
begin
    strList:=TStringList.Create;
    strList.Add('1234');
    getMem(result,sizeOf(strList));
    move(strList,result,sizeOf(strList));
    strList.Free;
end;procedure TForm1.Button6Click(Sender: TObject);
type
   psl=^TStringList;
var
  p:pointer;
begin
  p:=createMemArea;
  showMessage(psl(p)^.Strings[0]);
end;请问各位是什么原因呢?

解决方案 »

  1.   

    function createMemArea():pointer;
    var
      strList:TStringList;
    begin
        strList:=TStringList.Create;
        strList.Add('1234');
        getMem(result,sizeOf(strList));
        move(strList,result^,sizeOf(strList)); //加一个^
       // strList.Free; //不能释放
    end;procedure TForm1.Button6Click(Sender: TObject);
    type
       psl=^TStringList;
    var
      p:pointer;
    begin
      p:=createMemArea;
      showMessage(psl(p)^.Strings[0]);
    end;
      

  2.   

    这里  // strList.Free; //不能释放
    为何不能释放呢?我已经用move把strList的内存copy到新的内存区中去了呀。然后result返回的是新的内存区间的首地址。
      

  3.   

    你要明白,Delphi对象变量实际上只是一个指针,一个指向对象实体的只有几个字节的指针而已。你的StrList实际上也是指针,所以你Move的时候,实际上只是复制了指针指向的地址(内存地址),而不是这个对象实体本身。而且你在复制之后就将对象释放了,这样函数实际上返回的是一个指向一块已释放的内存的指针而已,你还要访问这块被释放内存,当然会出错了。
      

  4.   

    谢谢alexanda2000的回复,我搞错了复制指针跟复制内存的区别,现在明白了。再问一个问题就结贴了,如果上面的例子,要实现把strList指向的内存区段复制到另一段内存中,程序应该怎么写呢?
      

  5.   

    Delphi的函数可以返回任意类型,不需要象C/C++中那样经常需要使用显式的指向类型的指针作为返回值。
    你可以直接返回TStringList类型。
    function CreateMemArea: TStrings;
    begin
      result := TStringList.Create;
      result.Add('1234');
    end;procedure TForm1.Button6Click(Sender: TObject);
    var
      S: TStrings;
    begin
      S := CreateMemArea;
      showMessage(S.Strings[0]);
      S.Free;
    end;
      

  6.   

    TO楼上的,Thx, 我早知道这种方法可以,我之所以做这个例子,是想试试自己开僻跟释放内存。