vc做的dll返回值是char* ,delphi调用后内存泄漏 我在vc写了一个处理网络dll,函数返回值为char*delphi调用,用pchar接收返回值等我多次的loadlibrary(),得到返回值 freelibrary()后内存不断增加,我想是pchar没有释放的问题,请问这个pchar怎么释放? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 “pchar没有释放”的结论有待考证,1.如果有dll代码,阅读后找出真正原因2.如果没有dll代码,试一下:p:=dllfun();FreeMem(p);3.如果1、2不可行,则建议静态加载。 pchar声明是由调用方来释放的,意思是如果你与dll之间用pchar类型传递数据,pchar变量的空间管理应该由dll来完成,你这里不需要做任何处理的。 "...函数返回值为char* "你在DLL中返回的指针是初始化为1个不变的地址还是不断动态产生的?函数调用结果返回的指针最好在DLL内控制。如果是不断动态产生的、且没有释放措施那么在使用地(即DELPHI程序):p:=dllfun();try //用SetString或者Move将指向的字符串复制出来使用finally eeMem(p); end; 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内再写个函数释放了。 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类型数据...... 下面是一小段测试代码: { 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; vc++的dll函数转成delphi中的用法 spcomm控件的问题 史无前例的一天——昨天——见到了传说中的Kingron和GoodHope 关于ehlib3 如何实现浮动工具兰 简单问题?! ********大送分了(谁知道<<delphi 5企业级解决方案及应用剖析>>的范例代码哪里下载? 一个小问题,高手帮忙看看~~~ 请问如何去掉pagecontrol的tab标签? ****** 20 分 *********** 如何得到STRINGGRID的行号 循环问题出在哪里呢。请教高手 listview复制内容
p:=dllfun();
FreeMem(p);3.如果1、2不可行,则建议静态加载。
你在DLL中返回的指针是初始化为1个不变的地址还是不断动态产生的?
函数调用结果返回的指针最好在DLL内控制。
如果是不断动态产生的、且没有释放措施那么在使用地(即DELPHI程序):
p:=dllfun();
try
//用SetString或者Move将指向的字符串复制出来使用
finally
eeMem(p);
end;
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内再写个函数释放了。
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类型数据
......
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;