Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.15;
Скачать: CL | DM;

Вниз

ПАМЯТЬ НЕ ОСВОБОЖДАЕТСЯ!!!   Найти похожие ветки 

 
cyborg ©   (2002-06-17 11:37) [0]

В чём дело? При уничтожении класса память не освобождается, сейчас сидел специально смотрел, создаются пузырьки и уничтожаются, при этом память занимаемая программой неуклонно растёт, доходит в ОЗУ где то до 92 метров и сбрасывается в своп, при этом своп уже достиг более 300 метров, это кошмар какой то.
ОС WinXP, Delphi 6.
Желающим, кто не верит, могу выслать эту прогу с пузырьками, сами проверьте. Или сами попробуйте создавать и уничтожать любые классы, что будет?

Я уже заметил, что у меня все классы так не освобождают память.


 
Виктор Щербаков ©   (2002-06-17 11:45) [1]

Не, ну предположим такую ситуацию:

procedure Test;
var
SomeClass: TSomeClass;
i: Integer;
begin
for i := 0 to 10000 do
begin
SomeClass := TSomeClass.Create;
SomeClass.Free;
end
end;

Неужели после вызова процедуры Test память (в которой должны храниться экземпляры класса TSomeClass) не освободится?
Потестируй у себя подобным образом прежде чем делать выводы о том, что экз. всех классов не освобождают память.


 
kull ©   (2002-06-17 11:46) [2]

А вот не верю!
Приведи код...


 
Кулюкин Олег ©   (2002-06-17 11:55) [3]

А может все проще.
В конструкторе классо создаются объекты или списки, которые в процессе работы заполняются объектами, а в деструкторе это все не квасится.


 
kull ©   (2002-06-17 12:06) [4]


> Кулюкин Олег © (17.06.02 11:55)
> А может все проще.

Ага, вот-вот.


 
cyborg ©   (2002-06-17 12:09) [5]

Ща приведу , подредактирую только, там с разных модулей повырезаю ... ждите ...


 
cyborg ©   (2002-06-17 12:19) [6]


Type
TMiniBubble = class( TSprite )
Counter : integer;
Live : Integer;
constructor Create;
procedure Draw; override;
procedure Move; override;
end;

constructor TMiniBubble.Create;
begin
inherited Create( GfxDir + "MiniBubbles.png", 7, 7 );
AnimPhase := random( 2 );
Counter := 0;
X:=Random(320-7);
Y:=Random(280+7)+20;
Z:=Random(10);
Live:=Random(280);
end;

procedure TMiniBubble.Move;
begin
Dec(Live);
case Counter of
0 :
begin // Go up
if y > -7 then y := y - 1;
if y <= -7 then Kill;
if Live<=0 then Begin Inc(Counter);AnimPhase:=2; End;
end;
1..9 : inc( Counter ); // Wait
10 : Begin AnimPhase:=-1; Inc(Counter);end;
11 : begin Kill;end; // Death

// KILL вот тут и умирает пузырёк, и сласс делается free
// дальше из модуля вырежу, см. далее ...

end;
end;

procedure TMiniBubble.Draw;
const
SinTable : array[0..15] of integer = ( 0, 0, 1, 1, 2, 2, 1, 1, 0, 0, -1, -1,-1,-2,-2,-1 );
var
DestRect : TSDL_Rect;
begin
SrcRect.x := AnimPhase * w;
DestRect.x := x + SinTable[y and 15];
DestRect.y := y;
SDL_UpperBlit( Image, @SrcRect, Surface, @DestRect );
PrevRect := DestRect;
end;

Вот TSprite класс:

TSprite = class
ID: byte; { we can easily determine the sprite"s type }
ParentList: TSpriteList;
PrevRect: TSDL_Rect; { rectangle of previous position in the screen }
Flags: cardinal; { for SDL_BlitSurface }
isDead: boolean; { need to destroy ? }
SrcRect: TSDL_Rect; { source rectangle what contains the image-data }
AnimPhase: integer; { which image we draw }
x, y, z: integer; { x, y coords for screen, z for sorting }
w, h: integer; { Width & Height of sprite }
Surface, Background, Image: PSDL_Surface; { Screen, Background and sprite images }
NumberOfFrames: integer; { count of frames [by brombs] }
constructor Create(const _Image: string; Width, Height: integer);
procedure GetCollisionRect(Rect: PSDL_Rect); virtual;
function Remove: integer; { remove sprite from screen, result=-2 then background surface is lost }
procedure Draw; virtual; { draw sprite on screen }
procedure Move; virtual; { move a sprite }
procedure Kill; { we will need to destroy this sprite }
procedure Free; virtual; { destroy sprite }
end;



procedure TSprite.Free;
begin
if Image<>nil then SDL_FreeSurface(Image);
inherited Free;
end;

procedure TSprite.Kill;
begin
isDead:=true;
end;



procedure TSpriteEngine.Move;
var
i, max: integer;
TempSpr: TSprite;
begin
if Sprites.Count>0 then begin
NeedRedrawBackground:=false;
i:=0; max:=Sprites.Count;
repeat
if Sprites[i].Remove=-2 then NeedRedrawBackground:=true;

Вот тут он удаляется:

if Sprites[i].isDead then begin
TempSpr:=Sprites[i];
RemoveSprite(TempSpr);
TempSpr.Free;
dec(Max);
end
else
begin
Sprites[i].Move;
inc(i);
end;
until i>=Max;
end;
if NeedSort then begin
SortSprites;
NeedSort:=false;
end;
end;




???


 
cyborg ©   (2002-06-17 12:22) [7]

Create забыл

constructor TSprite.Create(const _Image: string; Width, Height: integer);
begin
inherited Create;
ID:=0;
if fileexists(_Image) then begin
Image:=IMG_Load(PChar(_Image));
Image:=SDL_DisplayFormat(Image);
Flags:=SDL_SRCCOLORKEY or SDL_RLEACCEL or SDL_HWACCEL;
SDL_SetColorKey(Image, Flags, SDL_MapRGB(Image.format,255,0,255));
NumberOfFrames := Image.w div Width;
end else
NumberOfFrames := 0;
AnimPhase:=0;
isDead:=false;
x:=0;
y:=0;
z:=0;
w:=Width;
h:=Height;
SrcRect.y:=0;
SrcRect.w:=w;
SrcRect.h:=h;
end;


 
cyborg ©   (2002-06-17 12:35) [8]

Мда, сделал вот так:

procedure TForm1.Button1Click(Sender: TObject);
var
SomeClass: TForm;
i: Integer;
begin
for i := 0 to 10000 do
begin
SomeClass := TForm.Create(Self);
SomeClass.Free;
end
end;


 
cyborg ©   (2002-06-17 12:35) [9]

ой, выше забыл дописать, что память освобождается.


 
cyborg ©   (2002-06-17 12:41) [10]

Блин, похоже имаджи не очищаются


 
Виктор Щербаков ©   (2002-06-17 12:46) [11]

В целях отладки можно добавлять записи со служебной информацией в ЛОГ-файл в конструкторе и деструкторе объектов. Анализируя потом его содержимое можно обнаружить массу интересных вещей.


 
kull ©   (2002-06-17 13:01) [12]


Memory Sleugth
( http://www.turbopower.com/)
Очень помогает искать memory leaks.
Даже строки кода указывает где была выделена память и не освобождена.


 
kull ©   (2002-06-17 13:03) [13]

Ой очепятка, правильно: Memory Sleuth


 
cyborg ©   (2002-06-17 13:04) [14]

Нашёл где ошибка, не моя :-)

Было в TSprite.Create:

Image:=IMG_Load(PChar(_Image));
Image:=SDL_DisplayFormat(Image);

Похоже терялась сама картинка после использования SDL_DisplayFormat
Сделал так:

Var
TempImage: PSDL_Surface;
...
TempImage:=IMG_Load(PChar(_Image));
Image:=TempImage;
Image:=SDL_DisplayFormat(Image);
SDL_FreeSurface(TempImage);


Люди, кто хорошо знает английский, помогите составить текст письма, что бы отправить создателю движка об ошибке, что память не освобождается.



Страницы: 1 вся ветка

Текущий архив: 2002.07.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
1-47416
Gayrus
2002-07-02 03:36
2002.07.15
bpl файлы


3-47235
RIPer
2002-06-20 16:33
2002.07.15
Алиас


1-47304
Ivan61
2002-06-30 21:47
2002.07.15
Ini или не Ini


14-47810
abitur
2002-06-16 20:48
2002.07.15
Win2K


14-47742
SleD
2002-06-03 19:40
2002.07.15
---|Ветка была без названия|---