我在vc写了一个处理网络dll,函数返回值为char*
delphi调用,用pchar接收返回值等我多次的loadlibrary(),得到返回值 freelibrary()后
内存不断增加,我想是pchar没有释放的问题,
请问这个pchar怎么释放?

解决方案 »

  1.   

    “pchar没有释放”的结论有待考证,1.如果有dll代码,阅读后找出真正原因2.如果没有dll代码,试一下:
    p:=dllfun();
    FreeMem(p);3.如果1、2不可行,则建议静态加载。
      

  2.   

    pchar声明是由调用方来释放的,意思是如果你与dll之间用pchar类型传递数据,pchar变量的空间管理应该由dll来完成,你这里不需要做任何处理的。
      

  3.   

    "...函数返回值为char* "
    你在DLL中返回的指针是初始化为1个不变的地址还是不断动态产生的?
    函数调用结果返回的指针最好在DLL内控制。
    如果是不断动态产生的、且没有释放措施那么在使用地(即DELPHI程序):
    p:=dllfun();
    try 
    //用SetString或者Move将指向的字符串复制出来使用
    finally
      eeMem(p); 
    end;
      

  4.   

    VC原型
    extern "C" char* __stdcall  SendPostData(char* _serverName,char* _functionPage,INTERNET_PORT port,char* _postData)
    {
            ...
    int nLength = httpSource.GetLength();
    char* returnChar =new char[nLength+1];
    memcpy(returnChar,httpSource,nLength);
    returnChar[nLength]='\0';
    return returnChar;
    }
    delphi 函数
    TSendPostData = function(serverName:pchar; page:pchar; port:WORD; postData:pchar):pchar;stdcall;delphi调用procedure TForm1.Button1Click(Sender: TObject);
    var
      rrr:pchar;
      i:integer;
      handlea:THandle;
      aptr:TFarProc;
    begin
      for i:=1 to 1000 do
      begin
        handlea := LoadLibrary(pchar('E:\Developing\C++\SendMessage\SendMessage\Debug\SendMessage.dll'));
        aptr := GetProcAddress(handlea,'SendPostData');
        rrr := TSendPostData(aptr)(pchar('192.168.17.105'),pchar('/loptexam/test.aspx'),WORD(80),pchar('testData'));
        freelibrary(handle);
      end;
    end;为了测试内存溢出,我用循环调用了1000次,没点击一次button1,内存就增长一部分,我想就是因为vc内的returnChar没有释放的问题,能不能在delphi内将其释放呢,如果不能那只好在vc内再写个函数释放了。
      

  5.   

    extern   "C"   char*   __stdcall     SendPostData(char*   _serverName,char*   _functionPage,INTERNET_PORT   port,char*   _postData)delphi:
    function SendPostData(_serverName:pchar;_functionpage:pchar;port:word;_postData:pchar):pchar;stdcall;调用时,可以这样:
    var
      serverName:array [0..255]of char;
      functionpage:array [0..255]of char;
      postData:array [0..255]of char;
      rltdata:pchar;
      str:string;
     
    //初始化数据区
     fillchar(servername,256,#0);
     fillchar(functionpage,256,#0);
     fillchar(postData,256,#0); 
    //发送数据;  
     rltdata:=sendpostdata(servername,functionpage,1060,postdata);
     str:=strpas(rltdata);//把返回数据变成string类型数据
    ......
      

  6.   

    下面是一小段测试代码:    { Private declarations }
      public
        function test(a:pchar;b:pchar):pchar ;
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }function TForm1.test(a, b: pchar): pchar;
    begin
      showmessage(strpas(a)+strpas(b));
      result:=pchar('aaaa');
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      a:array [0..255] of char;
      b:array [0..255] of char;
      c:pchar;
    begin
      a:='test';
      b:='test b';
      c:=test(a,b);
      showmessage(strpas(c));
    end;