Ymmärrä ja estä muistivuotoja Delphissä

DelfoiObjektisuuntautuneen ohjelmoinnin tuki on rikas ja tehokas. Luokat ja objektit sallivat modulaarisen koodiohjelmoinnin. Yhdessä modulaarisempien ja monimutkaisempien komponenttien kanssa ovat myös hienostuneempia ja monimutkaisempia Bugs.

Kehitettäessä sovelluksia Delphissä on (melkein) aina hauskaa, on tilanteita, joissa sinusta tuntuu kuin koko maailma olisi sinua vastaan.

Aina kun joudut käyttämään (luomaan) objektia Delphissä, sinun on vapautettava sen käyttämä muisti (kun sitä ei enää tarvita). Yritä / viimeinkin muistisuojauslohkot voivat varmasti auttaa estämään muistivuodot; Sinun on edelleen suojata koodisi.

Muisti (tai resurssi) vuoto tapahtuu, kun ohjelma menettää kykynsä vapauttaa kulutetun muistin. Toistuvat muistivuodot aiheuttavat prosessin muistin käytön kasvavan ilman rajoja. Muistivuodot ovat vakava ongelma - jos sinulla on koodi, joka aiheuttaa muistin vuodon, käynnissä olevassa sovelluksessa 24/7, sovellus syö koko käytettävissä olevan muistin ja lopulta kone lakkaa vastaamasta.

instagram viewer

Muistivuodot Delphissä

Ensimmäinen askel muistivuotojen välttämiseksi on ymmärtää niiden esiintyminen. Seuraavaksi käydään keskustelu joistakin yleisistä sudenkuopista ja parhaista käytännöistä vuotamattoman Delphi-koodin kirjoittamiseksi.

Useimmissa (yksinkertaisissa) Delphi-sovelluksissa, joissa käytät lomakkeelle pudotettuja komponentteja (painikkeet, muistiot, muokkaukset jne.) (Suunnittelun aikana), sinun ei tarvitse huolehtia liikaa muistin hallinnasta. Kun komponentti on asetettu lomakkeelle, siitä tulee muoto omistaja ja vapauttaa komponentin käyttämän muistin, kun lomake on suljettu (tuhottu). Form, omistajana, on vastuussa ylläpitämiensä komponenttien muistin varaamisesta. Lyhyesti: lomakkeen komponentit luodaan ja tuhotaan automaattisesti

Esimerkkejä muistivuodoista

Missä tahansa ei-triviaalisessa Delphi-sovelluksessa haluat pikaista Delphi-komponentit ajon aikana. Sinulla on myös joitain omia mukautettuja luokkia. Oletetaan, että sinulla on luokan TDeveloper, jolla on menetelmä DoProgram. Kun sinun on käytettävä TDeveloper-luokkaa, luot luokan esiintymän kutsumalla Luoda menetelmä (rakentaja). Luo-menetelmä varaa muistin uudelle objektille ja palauttaa viittauksen objektiin.

var
zarko: TDeveloper
alkaa
zarko: = TMyObject. Luoda;
Zarko. DoProgram;
end;

Ja tässä on yksinkertainen muistivuoto!

Aina kun luot objektia, sinun on hävitettävä sen käyttämä muisti. Jos haluat vapauttaa muistin allokoidun objektin, sinun on soitettava Vapaa menetelmä. Ollaksesi täysin varma, sinun tulisi käyttää myös kokeilla / lopulta estää:

var
zarko: TDeveloper
alkaa
zarko: = TMyObject. Luoda;
yrittää
Zarko. DoProgram;
vihdoin
Zarko. Vapaa;
end;
end;

Tämä on esimerkki turvallisesta muistin allokoinnista ja kaupanvarauskoodista.

Jotkut varoitussanat: Jos haluat dynaamisesti luoda Delphi-komponentin ja vapauttaa sen nimenomaisesti joskus myöhemmin, lähetä aina omistaja nolla. Tämän tekemättä jättäminen voi aiheuttaa tarpeettomia riskejä sekä suorituskykyyn ja koodin ylläpitoon liittyviä ongelmia.

Objektien luomisen ja tuhoamisen lisäksi Luo ja ilmainen -menetelmien lisäksi sinun on oltava myös erittäin varovainen käyttäessäsi "ulkoisia" (tiedostoja, tietokantoja jne.) Resursseja.
Oletetaan, että sinun on käytettävä jotakin tekstitiedostoa. Hyvin yksinkertaisessa tilanteessa, jossa AssignFile-menetelmää käytetään yhdistämään levyllä oleva tiedosto tiedostoon muuttujan, kun olet valmis tiedostosta, sinun on soitettava CloseFile-tiedostoon, jotta tiedoston käsittely alkaa käytetty. Täällä sinulla ei ole nimenomaista kutsua "ilmaiseksi".

var
F: TextFile;
S: merkkijono;
alkaa
AssignFile (F, 'c: \ somefile.txt');
yrittää
Readln (F, S);
vihdoin
CloseFile (F);
end;
end;

Toinen esimerkki sisältää ulkoisten DLL-tiedostojen lataaminen koodista. Aina kun käytät LoadLibrary-sovellusta, sinun on soitettava FreeLibrary: lle:

var
dllHandle: THandle;
alkaa
dllHandle: = Loadlibrary ('MyLibrary. DLL ');
// tee jotain tällä DLL: llä
jos dllHandle <> 0, niin FreeLibrary (dllHandle);
end;

Muistin vuototiedot .NET: ssä?

Vaikka Delphi for .NET: n kanssa roskienkeräjä (GC) hallitsee suurimpaa osaa muistitehtäviä, .NET-sovelluksissa voi olla muistivuotoja. Tässä artikkelikeskustelu GC Delphissä .NET: lle.

Kuinka taistella muistivuotoja vastaan

Modulaarisen muistiturvallisen koodin kirjoittamisen lisäksi muistivuodot voidaan estää käyttämällä joitain saatavissa olevista kolmannen osapuolen työkaluista. Delfoi Muistin vuoto-korjaustyökalut auttaa sinua saamaan Delphi-sovelluksen virheitä kuten muistin vioittuminen, muistivuodot, muistin allokointivirheet, muuttuvat alustusvirheet, muuttuvien määritelmien ristiriidat, osoitinvirheet ja paljon muuta.

instagram story viewer