小弟新手,请问为何释放内存时出错:源码:
var
  lpBuffer:PChar;
  nSize:DWORD;
begin
  lpBuffer := stralloc(255*sizeof(char));
  nsize := 254;
  getcomputername(lpbuffer,nsize);
  lpbuffer:=char(leftstr(string(lpbuffer),nsize));
  button1.caption:=lpbuffer;
  //以上都没有错误,button1.caption的显示也正确,下面这句出错
  //出错说:非法使用指针 inviald use pointer
  strdispose(lpbuffer);
end;

解决方案 »

  1.   

    不使用Stralloc的!
    用GetMem或AllocMem和FreeMem的
      

  2.   

    delphi5程序员指南上不是说只有分配的和释放的函数对应起来就没问题吗?
    例如:
    getmem     freemem
    globalalloc  globalfree
    stralloc   strdispose
    strnew     strdispose
      

  3.   

    getmem 
    freemem
    就行
      

  4.   

    GetMem
    procedure GetMem(var P: Pointer; Size: Integer);AllocMem
    function AllocMem(Size: Cardinal): Pointer;FreeMem
    procedure FreeMem(var P: Pointer[; Size: Integer]);
      

  5.   

    var
      lpBuffer:PChar;
      nSize:DWORD;
    begin
      lpBuffer := stralloc(255*sizeof(char));
      nsize := 254;
      getcomputername(lpbuffer,nsize);
      lpbuffer:=pchar(lpbuffer);
      button1.caption:=lpbuffer;
      strdispose(lpbuffer);
    end;以上執行沒錯>>lpbuffer:=char(leftstr(string(lpbuffer),nsize));
    這句有問題
    檢查可用如下:
     ShowMessage(IntToStr(Integer(lpbuffer)));
     lpbuffer:=char(leftstr(string(lpbuffer),nsize));
     ShowMessage(IntToStr(Integer(lpbuffer)));
    //檢查執行前後的指針是不是被改了
     
      

  6.   

    哦,原来是犯了低级错误,lpbuffer的指针被重新赋值了,所以释放时会出错,改成如下就没问题了,谢谢各位大虾,结贴!
    var
      lpBuffer:PChar;
      nSize:DWORD;
    begin
      lpBuffer := stralloc(255*sizeof(char));
      nsize := 254;
      getcomputername(lpbuffer,nsize);
      //lpbuffer:=char(leftstr(string(lpbuffer),nsize));
      button1.caption:=char(leftstr(string(lpbuffer),nsize));
      //这样就没有改变指针的地址了
      //button1.caption:=lpbuffer;
      strdispose(lpbuffer);
    end;