关于DLL内存释放,为何DLL占用的内存不释放?(100分)

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

liangexcel

Unregistered / Unconfirmed
GUEST, unregistred user!
一个MDI+DLLChild程序,程序分几个模块,每个模快做成一个DLL,每个DLL内有数个子窗体.
主程序刚启动时,内存占用是17M(任务管理器中),调用DLL中的子窗体,打开数据库并显示,大约再耗掉2M左右内存,之后每打开一个窗体耗掉内存大约也是1-2M左右.但当我关闭关释放当前的一个子窗体,任务管理器中的内存根本没有变化(不减少),当我把所有窗体都关闭,并用FreeLibrary释放DLL,内存还是没有变化。但当我再次调用这个DLL,打开子窗体时,内存耗用却在继续增加,但却没有第一次打开时占用那么多,大约是几百K左右。这是怎么回事?难道DLL的内存不能释放的吗?为何再次调用DLL时,内存反正继续增加?
//窗体创建过程
function frmNumOpen(AHandle: THandle; AForm: TForm):Longint;stdcall;
begin
if not Assigned(DM) then
DM := TDM.Create(Application);
frmNum := TfrmNum.Create(AForm);
frmNum.zHandle := AHandle;
result := Longint(frmNum);
end;
//窗体关闭过程
procedure frmNumClose; StdCall;
begin
if assigned(frmNum) then
begin
FreeAndNil(frmNum);
end;
// if not Assigned(frmNum) then
// FreeAndNil(DM);
end;
//当点击关闭按错时,发错信息给主程序,关闭子窗体
procedure TfrmNum.FormClose(Sender: TObject; var Action: TCloseAction);
begin
postMessage (zhandle, WM_MyMsg1, 1,0);
end;
//主程序关闭及释放的过程,先释放窗体,再判断有没有存在指定DLL内的窗体存在,如果没有了,则释放DLL
1: if Assigned(frmNum_Basic_Close) then
begin
frmNum_Basic_Close;
AfrmNum_Basic := nil;
if DestroyD_Num then
begin
FreeLibrary(D_NumHandle);
D_NumHandle := 0;
end;
end
 
把主窗体最小化一下再看看内存,如果确实释放掉了内存会变小的。
 
的确存在此问题
 
我贴上了源码,这是主要关系的过程,但是和普通的DLL没有什么分别呀,我也是学别人的例子的.
 
1.Dll中含有窗体时,会出现内存泄漏,这是公认的:
是由Classes单元的MakeObjectInstance函数造成的。VirtualAlloc每次分配4KB字节内存,而FreeObjectInstance没有释放这个内存。但是这只有4K
2.建议楼主关注一下自己的窗体在关闭的时候,那个Form有没有Destroy。比如在Destroy的时候设置断点等方式。
3.从你调用FreeLibrary都没有改变内存,我怀疑你是不是都没有Free过?
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=18004
降内存
 
to xiammy,nicai_wgl:在Destroy中设置了断点之后,证明窗体是给释放了.但也如nicai_wgl所言,最小化一次主窗体的时候,内存占用跌到了2M以下,甚至是几百K,比第一次启动所占的17M少了不知道多少倍了.这是怎么回事?任务管理器中的内存显示真不真实的呀?难道最小化能释放内存?为何我不最小化的时候,我就算只是打开同一个窗本,内存占用亦会达数十M之多?
 
用TMPHANDLE:=LOADLIBRARY('你的DLL')加载DLL,在FINALLY里再判断TMPHANDLE是否不为空,不为空再FREELIBRARY,这样可以很好的解决你的问题,我以前也是这样的问题(DLL中有窗体),现在用这种方法已经切底的解决了.用了好久没有出错过.
 
D_NumHandle是个什么东西,什么地方进行LOADLIBRARY?
另外我看你的DM就没地方释放
 
多人接受答案了。
 
后退
顶部