Módszerek a memória szivárgásának ellenőrzésére a programban

Módszerek a memória szivárgásának ellenőrzésére a programban

Mondja meg, hogy ellenőrizze, van-e memóriaszivárgás a programban vagy sem. Úgy tűnik, hogy vannak különleges összetevők ehhez?

FastMM4, MemProof, # xA0; AQTime

Mondja el nekem. Megállapítottam, hogy ha ezt a funkciót egy hurokban hívjuk, a memória szivárgást eredményez. Miért?

TMyRec = rekord
# xA0; MStr: String;
# xA0; UStr: String;
# xA0; ID: egész;
végén;

funkció GetMR: TMyRec;
kezdődik
ZeroMemory (@Result, SizeOf (Eredmény));

Result.MStr: = "Szöveg";
Result.UStr: = "Szöveg";
Result.ID: = 1;
végén;

A második és a későbbi bemeneteknél az Eredmény tartalmazza az előző adatokat.
Ezek törléséhez végrehajtom a ZeroMemory (@Result, SizeOf (Eredmény));
De rájöttem, hogy ha ezt az eljárást eltávolítják, nem lesz memória szivárgás.
Miért? És mennyire helyes ebben az esetben, ha törli az Eredményt?


> # xA0; Megállapítást nyert, hogy ez a függvény hívja a hurok eredményét
> memória szivárgás.

de hogyan találta meg?

És ha nem a String, és a ShortString használata, a szivárgás figyelni fog?

Megnyitom a Windows Feladatkezelőt, és megnézem a felhasznált memóriát. Ha eltávolítja a ZeroMemory vonalat, akkor a használt memória megáll.


> Nyissa meg a Windows Feladatkezelőt, és nézze meg a memóriát
> költünk

Milyen oszlopot nézel? Nincs olyan oszlop, amely tükrözné a ténylegesen elfoglalt memóriát.
A szivárgás akkor keletkezik, mert nem szükséges a ZeroMemory hosszú soraira

"CPU" után nézek "Memória".
Igen, pontosan, ha például Stringet [250] teszel, akkor a memória változatlan marad. Elfelejtettem, hogy a vonalak is dinamikusak. tömbök.

A nyomorúságos Baks * 99 mögött


> Baks # xA0; (31.01.11 03:07) [11]
>
> A nyomorúságos Baks * 99 mögött
>

Tudod és a "nyomorult". És nyugodtabb vagyunk.
És nagyon igazi segítséget nyújt (technikai támogatás) a nagyon valódi emberektől.
By the way nagyon tisztelt ebben a fórumban. (És más jól ismert orosz nyelvű fórumokon a Delphi-on).

Ui A "nyomorult 99 dollárról". Mennyibe kerül havi mobiltelefonjára?

P.P.S. Vagy félreértettem?


> # xA0, Vagy félreértettem?


> Mennyibe kerül havi mobiltelefonjára?

A FastMM4 megkéri az SHFolder.dcu-t. Hol szerezhetem? Hol lehet? Van egy Delphi 5.

Baks # xA0; (30.01.11 19:54)
MStr: String;
Thong nizya ZeroMemory, Thong egy mutató.
de ezt vegye ki ezt:
eljárás TForm1.Button1Kattintson (Feladó: TObject);
var
# xA0; i: egész szám;
# xA0; p: mutató;
kezdődik
# xA0; i: = 0-10
# xA0; kezdődik
# xA0; # xA0; GetMem (p, 1048576);
# xA0; # xA0; p: = 0;
# xA0; # xA0; FreeMem (p);
# xA0; vége;
végén;

Inni egy beteget? nincs
Páciens dohányzás? nincs
A nők sétálnak? nincs

Doktor: Ne ellenálljon a betegnek, én még mindig azt találom.


> Thong Neez ZeroMemory

Igen, már értettem. Én csak tépte a tanga :)


> a beteg nem ellenáll, nem érdekel, mit találok

És itt akarok kérdezni:

Csatlakozott FastMM-hez, kapott:

Ebben az alkalmazásban memóriazavarok fordulnak elő. Kis méretű blokkok szivárgása (a mutató által regisztrált várható szivárgások nélkül): 37 - 52 byte: AnsiString x 1

Ez a következő kód miatt történt:

inicializálás
# xA0; AppPath: = ExtractFilePath (ParamStr (0));
# xA0; FilesPath: = AppPath + FilesDirName + "";

Több szivárgási üzenet nem jelenik meg. Jól csináltam?
És még egy kérdés: miért nem jelentettek semmit a FilePath változóról?


> Baks # xA0; (30.01.11 19:54)
>
> Mondja meg, hogy ellenőrizze, van-e memóriaszivárgás a programban
> vagy nem. Úgy tűnik, hogy vannak különleges összetevők ehhez?

kezdődik
# xA0; writeeln (ParamStr (1));
végén.

és indítsa el

a (z) %% n in (F: \ mypath \ *. ent) programban a.exe %% n

A taskmgr-ben láthatjuk, hogy a memória folyik. Valahol.

a.exe "F: \ mypath \ file1.ent"
a.exe "F: \ mypath \ file2.ent"
a.exe "F: \ mypath \ file3.ent"
a.exe "F: \ mypath \ file4.ent"
.

Együtt dolgoztam a FastMM-mel, mint minden, ami releváns, néha magam is használom, ha elfelejtem

By the way, elolvastam a két cikket a közelmúltban, azt találtam keresztül google.

Kapcsolódó cikkek