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.