A memóriaszivárgások megértése és megelőzése a Delphiben

DelphiAz objektum-orientált programozás támogatása gazdag és hatékony. Az osztályok és objektumok lehetővé teszik a moduláris kód programozást. A modulárisabb és összetettebb komponensek mellett kifinomultabb és összetettebbek is bogarak.

Míg fejlődik alkalmazások Delphi-ben (szinte) mindig szórakoztató, vannak olyan helyzetek, amikor úgy érzi, mintha az egész világ ellen lenne.

Ha bármilyen objektumot kell használni (létrehozni) a Delphi-ben, fel kell szabadítania az elhasznált memóriát (egyszer már nincs rá szüksége). Bizonyára a kipróbálás / végül memóriavédő blokkok segíthetnek megakadályozni a memóriaszivárgásokat; továbbra is rajtad múlik, hogy megóvja-e a kódját.

Memória (vagy erőforrás) szivárgás akkor fordul elő, amikor a program elveszíti a képességét az elfogyasztott memória felszabadítására. Az ismételt memóriaszivárgások miatt a folyamat memóriahasználata korlátozás nélkül növekszik. A memóriaszivárgás komoly probléma - ha van olyan memóriaszivárgást okozó kód, akkor fut egy alkalmazásban A nap 24 órájában, az alkalmazás elhasználja a rendelkezésre álló memóriát, és végül a gép nem reagál.

instagram viewer

Memóriaszivárgások Delphiben

A memóriaszivárgások elkerülésének első lépése annak megértése, hogyan történnek. Az alábbiakban néhány, a nem szivárgó Delphi-kód írására szolgáló gyakori hibákat és bevált gyakorlatokat tárgyalunk.

A legtöbb (egyszerű) Delphi alkalmazásban, ahol az összetevőket (gombok, emlékeztetők, szerkesztések stb.) Használja az űrlapra dobva (a tervezési időpontban), nem kell túl sokat törődnie a memóriakezeléssel. Miután az összetevőt egy űrlapra helyezte, az űrlap lesz az tulajdonos és felszabadítja az összetevő által elfoglalt memóriát, amikor az űrlap bezáródik (megsemmisül). A forma, mint tulajdonos, felelős az általa üzemeltetett komponensek memóriakereséséért. Röviden: az űrlap komponensei automatikusan létrejönnek és megsemmisülnek

Példák a memóriaszivárgásokra

Bármilyen nem triviális Delphi alkalmazásban szeretné a Delphi-komponensek azonnali végrehajtása futás közben. Önnek is lesz néhány saját osztálya. Tegyük fel, hogy van egy osztályfejlesztője, amely rendelkezik egy DoProgram módszerrel. Most, amikor a TDeveloper osztályt kell használnia, létre kell hoznia egy osztály példányát a teremt módszer (kivitelező). A Létrehozás módszer memóriát allokál egy új objektumhoz, és referenciát ad vissza az objektumhoz.

var
zarko: TDeveloper
kezdődik
zarko: = TMyObject. létrehozása;
Zarko. DoProgram;
végén;

És itt van egy egyszerű memóriaszivárgás!

Bármilyen objektum létrehozásakor el kell távolítania az elfoglalt memóriát. A hozzárendelt objektum memória felszabadításához fel kell hívnia a Ingyenes eljárás. Annak érdekében, hogy teljesen biztos lehessünk, a try / végleges blokkot is használnod kell:

var
zarko: TDeveloper
kezdődik
zarko: = TMyObject. létrehozása;
próbáld ki
Zarko. DoProgram;
végül
Zarko. Ingyenes;
végén;
végén;

Ez egy példa a biztonságos memória allokációra és az üzletkötési kódra.

Néhány figyelmeztető szó: Ha egy Delphi komponenst dinamikusan el akar készíteni, és valamikor később kifejezetten fel szeretné szabadítani, akkor mindig nullát adja át a tulajdonosnak. Ennek elmulasztása szükségtelen kockázatot, valamint teljesítmény- és kódkarbantartási problémákat okozhat.

Az objektumok létrehozása és megsemmisítése mellett a Létrehozás és a Szabad módszerek használatával nagyon óvatosnak kell lennie a "külső" (fájlok, adatbázisok stb.) Erőforrások használatakor is.
Tegyük fel, hogy működnie kell valamilyen szöveges fájlban. Egy nagyon egyszerű forgatókönyvben, amikor az AssignFile metódust használják a lemezen lévő fájl társításához egy fájlhoz változó, amikor elkészült a fájllal, fel kell hívnia a CloseFile fájlt a fájlkezelő megkezdéséhez használt. Itt nincs kifejezett hívása a "Free" -re.

var
F: TextFile;
S: húr;
kezdődik
AssignFile (F, 'c: \ somefile.txt');
próbáld ki
Readln (F, S);
végül
CloseFile (F);
végén;
végén;

Egy másik példa a külső DLL-ek betöltése a kódból. A LoadLibrary használatakor fel kell hívnia a FreeLibrary-t:

var
dllHandle: THandle;
kezdődik
dllHandle: = Loadlibrary ('MyLibrary. DLL ”);
// csinálj valamit ezzel a DLL-sel
ha dllHandle <> 0, akkor FreeLibrary (dllHandle);
végén;

Memóriaszivárgás a .NET-ben?

Habár a Delphi for .NET esetében a hulladékgyűjtő (GC) kezeli a legtöbb memóriafeladatot, lehetséges. Memóriaszivárgások a .NET alkalmazásokban. Itt egy cikkbeszélgetés GC a Delphi-ben a .NET-hez.

Hogyan lehet harcolni az memóriaszivárgás ellen?

A moduláris memóriabiztonsági kód írása mellett a memóriaszivárgások elkerülhetők a rendelkezésre álló harmadik féltől származó eszközök használatával is. Delphi Memóriaszivárgás-javító eszközök segít elkapni a Delphi alkalmazást hibák például memória sérülése, memóriaszivárgás, memóriaelosztási hibák, változó inicializálási hibák, változó definíciós konfliktusok, mutató hibák és így tovább.