在“深度历险”看到的问题,有关内存被吃掉!(100分)

  • 主题发起人 主题发起人 nisky
  • 开始时间 开始时间
N

nisky

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我在“深度历险”论坛看到的一个问题,有关内存被吃掉,代码如下,我这里列出的代码做了一些修改,但是问题依然存在,希望各位能解释一下为什么?
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TOpp=Class(TPersistent)
public
Scale:array[1..10000]of Integer;
Constructor Create;virtual;
Destructor Destroy;override;
end;

TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
Opp:TOpp;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TOpp }

constructor TOpp.Create;
begin
inherited Create;
end;

destructor TOpp.Destroy;
begin

inherited Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
MS1:TMemoryStatus;
//i:Integer;
begin
//for i:=1 to 10 do
//begin
//Memo1.Lines.Add(Format('第%d次',));
MS1.dwLength:=SizeOf(TMemorystatus);
FillChar(MS1,SizeOf(TMemorystatus),0);
GlobalMemoryStatus(MS1);
Memo1.Lines.Add(Format('MS1-Free=%d',[MS1.dwAvailPhys]));

Opp:=TOpp.Create;
MS1.dwLength:=SizeOf(TMemorystatus);
FillChar(MS1,SizeOf(TMemorystatus),0);
GlobalMemoryStatus(MS1);
Memo1.Lines.Add(Format('MS1-Create=%d',[MS1.dwAvailPhys]));
Opp.Free;
Opp:=nil;

MS1.dwLength:=SizeOf(TMemorystatus);
FillChar(MS1,SizeOf(TMemorystatus),0);
GlobalMemoryStatus(MS1);
Memo1.Lines.Add(Format('MS1-Destory=%d',[MS1.dwAvailPhys]));
//end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
MS:TMemoryStatus;
begin
GlobalMemoryStatus(MS);
Memo1.Lines.Add(Format('Now=%d',[MS.dwAvailPhys]));
end;

end.
我的测试结果为:
MS1-Free=0
MS1-Create=0
MS1-Destory=32768
MS1-Free=45056
MS1-Create=0
MS1-Destory=32768
MS1-Free=45056
MS1-Create=0
MS1-Destory=32768
MS1-Free=45056
MS1-Create=0
MS1-Destory=32768
MS1-Free=45056
MS1-Create=0
MS1-Destory=32768
 
这样的测试并不能说明delphi有内存泄漏问题。

delphi的内存管理机制不是直接建立在windows api的调用上,
而是有自己的内存管理算法。

通常当堆内存不够时,delphi会向Windows申请比他当前需要要大的内存,
以减少反复调用windows api的次数,提高性能。同时也使小对象的内存使用更为优化。

如果程序释放了内存,delphi很可能不会把空闲的内存立即交还给Windows(可能就从不
归还)。当然在windows看来,看不到delphi交还内存。
 
你可以用BoundsChecker For Delphi or MemProof(free software)来检查一下有没有
内存泄漏.
 
有没有BOUNDSCHECK for C++BUILDER???
 
类似问题问:每次自己create from之后,然后free form发现一个问题,就是程序占用的
内存的并没有减少。迷惑中
 
To: wangfu
有同感,不知何解?


关注!
 
free帮助上是写的form的owner是application所以知道application退出的时候才会释放。
其实我也没有搞明白。正在向其他人问
 
不是吧?
我测试了一下,可以释放的
 
Free之后,再Nil

内存才会真正释放的
 
后退
顶部