Skocz do zawartości

[Delphi]Przydział i zwalnianie pamięci używając wskaźników.


5corpio

Polecane posty

Witam mam taki dziwny problem otóż coś nie tak chyba robię przydzielając i zwalniając pamięc w programie jak używam do tego celu wskaźników. Mam taki przykład powiedzmy:

[delphi][/delphi]
Nie ma nic więcej w kodzie. I teraz pytanie bo sprawdzam pamięć przydzieloną do programu (w menadżerze zadań windows) przed wciśnięciem przycisku do alokowania pamięci i zajmuje powiedzmy 3mb po przydzieleniu z 5.5 a po "niby" zwolnieniu nadal zostaje to 5.5. Co jest nie tak ponieważ już próbowałem różnie. W helpie od Turbo Delphi każą dodać moduł ShareMem bodajże używając Dispose i New czy jakoś tak nawet korzystałem z metod z tego unitu i też nic.

Edit: Jest też tak, że gdy zrobie dużo większą tablice i przydziele pamięć poprzez New to powiedzmy mam zajęte 23mb po "niby" zwolnieniu wraca mi do powiedzmy 9mb czyli nie do tego "początkowego" rozmiaru.

Edit2: hehe Sazian racja jakoś mi to umknęło ;D

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

Ten kod zdaje się być całkowicie w porządku. Skompilowałem to w Lazarusie (nie wiem czy to ma tutaj znaczenie) i wyniki były takie, że po zaalokowaniu tablicy pamięć programu rosła o 1.4 MB, a po zwolnieniu wracała do wartości poprzedniej. Powtórzyłem to z 10 razy i nie było żadnych ubytków smile.gif

Link do komentarza
Udostępnij na innych stronach

u mnie działa ..

Po uruchomieniu jest 2700 ~ przydzieleniu 4300~ a po zwolnieniu 3400~ pozniej za kazdym zwolnieniem zwalnie prawidłowo do 3400~ . Mam windows Xp Pro z SP2 . wink.gif chociaz watpie czy service pack ma cos do tego ..

Lubię cytryny !

Link do komentarza
Udostępnij na innych stronach

Tez trochę poeksperymentowałem... Dodatkowo "kazałem" pamiętac kazdemu elementowi "cos" adres na samego siebie. Uzyłem dwoch konstrukcji , jedna to podana przez 5corpio a druga to "pamiętanie" lementu "cos" w liscie a nie w tablicy
Wynik są różne. Mniejszy ubytek (raptem 4KB) występują przy uzyciu list. Ponizej kod mojego testowania

[code=Delphi]
type
PCos=^Cos;
Cos=pString;
TForm1 = class(TForm)
]N]]]YH]6Ć66VćFW#D&ŚV7B&6VGW&R'WGF$6Ć66VćFW#Q=(Ń(AŃąŃ(ą( { Public declarations }
end;

var
Form1: TForm1;
L:TL^VKLH[[[Y[][b33c\"ćFf&6VGW&RDf&Ó'WGF6Ć66VćFW#D&ŚV)Ń)(Ńźź(( New(cos[i]);
cos[i]:=Addr(cos[i]^);
end;
end;

proceHLK]XĘ[X
NH[YVvf\"ŁÓFFF76R65śŚVćCQ ŃŃ
ąŹĄMQ=)(
A

i:integer;
begin
L:=TList.Create;
for i:=1 to 10000 do
Y[]ĘPĘNPPYPNY
PĘN[VćC&6VGW&RDf&Ó'WGF$6Ć66VćFW#D&ŚV7Bf\"Ń)(Ńź0
ź(ĄA
Ą.Items[i]));
L.Free;
end;

end.
[/code]

pozdrawiam oksal

Link do komentarza
Udostępnij na innych stronach

No ale dochodzimy do wniosku, że coś jest nie tak. I wartało by gdzieś zasięgnąć dalej z tym problemem. Mam XP media center 2k5 z SP2 ale to też pewnie dużo nie zmienia. Myślicie, że wsparcie jakieś techniczne ze strony microsoftu mogło by pomóc ew. coś powiedzieć ?

[quote] Dziwne jest ze jezeli uzyje jakiegos programu do czyszczenia ramu uzyta pammiec dochodzi do normalnego poziomu [/quote] Czyli, że niby magiczny XP, który miał być lepszy nadal do dupy zwalnia pamięć czy cuś w tym stylu ?

Ot taka mini-strona moja po godzinach :)http://www.wnetrzekuchni.pl

Link do komentarza
Udostępnij na innych stronach

[quote name='oksal' post='7049' date='pon, 08 sty 2007 - 21:04'] [code=Delphi]
ACos:=Addr(ACos^);
+hs6Źjhvz33zZaPWHHPWN [/code]

UPDATE
Oskal: Do listy wpisujesz 10 000 elementów zamiast 100 000, może to ma jakiś wpływ na tę różnicę...
Nie czepiam się, że ten zapis jest tylko w inny sposób przedstawiony, ale o to, że to jest samo w sobie bez sensu tongue.gif

Link do komentarza
Udostępnij na innych stronach

[quote] Czy to czasami nie jest jednoznaczne z:
[code=Delphi]
ACos[i] := ACos[i];
[/code] [/quote]

jest jednoznaczne. Tak jak lecial na unice "konkurs" sto iles tam sposobow wyrzucenia napisu, ale nie oto mi chodziło czy mozna tak przypisac czy tez inaczej. Chce pokazac ze uzycie TList daje mniejsze straty .. ktore pomimo tego jednak są

PS
Nie ma sensu rozdrabniac głownego tematu

pozdrawiam oksal

Link do komentarza
Udostępnij na innych stronach

[quote] Oskal: Do listy wpisujesz 10 000 elementów zamiast 100 000, może to ma jakiś wpływ na tę różnicę...
Nie czepiam się, że ten zapis jest tylko w inny sposób przedstawiony, ale o to, że to jest samo w sobie bez sensu tongue.gif [/quote]

Bez sensu czy nie? a co miałem tam przypisac? jezeli nie chcialem aby lądowały tam smieci z pamieci kompa?

Ziwększylem z tych 10 000 na 100 000 jednoczesnie zmieniajac i:integer na i:longInt. Wynik jaki uzyskałem, to nadal zgubione tylko 4 kB

uruchomienie praogramu : 2408
utworzenie 100 000 elementów w liscie : 3976
zwolnienie elementow : 2412

I nie mialo znaczenia czy cos do zmiennej "cos" przypisywałem. Wniosek przechowywanie wskaznikow w TList lepiej zwalnia pamięć. Problem nadal jest. Do czego jest wykorzystane te 4 kB?

PS
W kazdym badz razie nie przeszkadza to w spozywaniu piwa:)

pozdrawiam oksal

Link do komentarza
Udostępnij na innych stronach

To ja też się wypowiem. smile.gif
Do kodu 5corpio dodałem takie coś.
[code=Delphi] :k}śzk^$YgjJ0[hZśóZ$k;Łzv~;-źŚ Ś(vśóY,z73&
Z-źjj$)'Śźr+$0ĄŁyvz+k:0Ł:k
Zvyz7Ź<xĘz,iz<\"z=!Łns6ŹjhŃąC3j7\"zĘmhśŚóK\"s-źK3ŚQ ŃŃ
ąŹĄMQ=)(źź sie nie dzieje smile.gif
end; [/code]
Kliknięci w taki przycisk powoduje u mnie zwiększenie programu o 32kb wink.gif

Może ta różnica po zwolnieniu wynika z faktu obsługi kliknięcia bądź czegoś innego (np. wywołań funkcji systemowych itp itd)

System: win xp home sp2
Środowisko: D2005

Pozdrawiam,

vo7 (;

Link do komentarza
Udostępnij na innych stronach

Ok miśki, dostałem odpowiedź od działu technicznego Borlanda:

[quote] Takie zachowanie to typowe działanie Memory Managera. Nie zwalnia on systemowi całej pamięci, którą wcześniej zarezerwował, aby w przyszłości nie rezerwować jej ponownie tylko wykorzystać nie zwolniona, ale nie wykorzystaną pamięć. Szczególnie w Turbo Delphi powinno to być widoczne, gdzie działa nowoczesny i bardzo zoptymalizowany menedżer pamięci FastMM. Proszę się nie przejmować takimi wynikami (...) nie jest to żaden bład.

Jako ciekawostkę proponuje zapoznać się z artykułem na temat optymalizacji w nowym menedżerze pamięci:
http://dn.codegear.com/article/33416 [/quote]

smile.gif

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...