Текущий архив: 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.48 MB
Время: 0.014 c