Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.012 c
14-47801
Skiper
2002-06-10 10:17
2002.07.15
Как написать свой Shell (альтернатива Explorer у)


7-47812
ol
2002-04-17 10:24
2002.07.15
Подскажите как применить функцию для работы с сом-портом


3-47175
fool
2002-06-19 12:14
2002.07.15
Ошибки по русски,про Oracle слышал, а MSSQL?


7-47839
Максим_
2002-04-23 15:02
2002.07.15
Текст разного цвета в DrawGrid


14-47698
Igorek
2002-06-17 23:33
2002.07.15
~Rand~, обьясни нам глупым что ты хочешь - может поймем.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский