用GetMem和FreeMem为什么会一直内存泄露,眼睁睁看着程序占用内存直线上涨(100分)

  • 主题发起人 linxiaovoc
  • 开始时间
L

linxiaovoc

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个CORBA服务器端程序,调用一个C写的DLL,该程序有一个函数如下:
TPlayGetStatus = function(nChannel:integer ;
lpszFileName :pchar ;
tStartTime:pchar ;var wStatus:integer;var nBitrate:integer;
var nProgNum:integer):integer;cdecl;
PlayGetStatus : TPlayGetStatus ;
//上面是函数定义
function TDvnvs.VSPlayGetStatus ( const nChannel : Integer;
out lpszFilePath : AnsiString;
out strStartTime : AnsiString;
out nStatus : Integer;
out nBitrate : Integer;
out nProgNum : Integer): Integer;
var
pTempFile :pchar ;
pTempTime :pchar ;
strLog :string ;
ret :integer;
begin
if myhandle = 0 then
begin
Result := -1 ;
exit ;
end;
@PlayGetStatus := GetProcAddress(myhandle , 'PlayGetStatus');
if @PlayGetStatus = nil then
begin
strLog := 'Cannot get procedure address of PlayGetStatus' ;
WriteLog(strLog);
Result := -1 ;
exit ;
end;
GetMem(pTempFile , 512);
GetMem(pTempTime , 512);
ret := PlayGetStatus(nChannel , pTempFile,
pTempTime , nStatus , nBitrate , nProgNum);
if (ret <> 0) then
begin
strLog := 'Cannot PlayGetStatus of ' + inttostr(nChannel) ;
WriteLog(strLog);
Result := -1 ;
FreeMem(pTempFile , 512);
FreeMem(pTempTime , 512);
exit ;
end
else
begin
//strLog := 'Get Play port set Successfully ' + inttostr(nChannel) ;
//WriteLog(strLog );
lpszFilePath := pTempFile ;
strStartTime := pTempTime ;
Result := 0 ;
FreeMem(pTempFile , 512);
FreeMem(pTempTime , 512);
exit ;
end;
Result := 0 ;
end;
该函数的作用是从DLL的相应函数中传出相应的值,其中有两个pchar的数据要传出,就得要事先
分配内存GetMem(pTempFile,512),Getmem(pTempTime , 512)
将这几个参数传入DLL的函数执行,最后将传出的值赋给相应的变量,再传给CORBA客户端。
现在的问题是:我明明在最后有FreeMem(pTempFile, 512 ), FreeMem(pTempTime , 512),
应该说操作是正确的,为什么内存不能够释放呢?
我知道是这段代码是因为我的监控程序一直执行该函数,没有执行其他函数了,所以肯定
是这里面存在问题。
会不会是因为
lpszFilePath := pTempFile ;
strStartTime := pTempTime ;
这里存在问题呢?
 
我一直担心是动态分配内存造成了内存不断不涨,因此接下来修改程序,在程序中采用全局变量
,即事先分配好lpszFilePath,strStartTime,然后在函数中不再分配了,但是仍然出现内存
不断上涨的情况,不知哪位有相关经验的,给提个醒吧,感激不尽。
 
动态连接库中的'PlayGetStatus'这个函数有没有内存泄漏?
把这个函数注释掉再执行看看有没有内存泄漏
 
顶部