DelphiObjektorienteeritud programmeerimise tugi on rikkalik ja võimas. Klassid ja objektid võimaldavad modulaarset koodiprogrammeerimist. Koos moodsamate ja keerukamate komponentidega on ka keerukamad ja keerukamad vead.
Kuigi areneb rakendused Delphis on (peaaegu) alati lõbus, on olukordi, kus tunnete, nagu oleks kogu maailm teie vastu.
Kui teil on vaja Delphis mõnda objekti kasutada (luua), peate selle tarbitud mälu vabastama (kui seda enam pole vaja). Muidugi võivad proovimise / lõpuks mälu kaitsmise plokid aidata teil mälu lekkeid vältida; ikkagi on teie koodi kaitsmine teie enda ülesanne.
Mälu (või ressursi) leke ilmneb siis, kui programm kaotab võimaluse tarbitud mälu vabastada. Korduvad mälulekked põhjustavad protsessi mälukasutuse piiratust. Mälulekked on tõsine probleem - kui teil on töötavas rakenduses mälulekke põhjustav kood Ööpäevaringselt sööb rakendus ära kogu saadaoleva mälu ja paneb masina lõpuks reageerima.
Mälulekked Delphis
Esimene samm mälulekke vältimiseks on mõista, kuidas need tekivad. Järgnev on arutelu levinud Delphi koodi kirjutamise tavaliste probleemide ja parimate tavade üle.
Enamiku (lihtsate) Delphi-rakenduste puhul, kus kasutate vormile langevaid komponente (nupud, memod, muudatused jne) (kujundamise ajal), ei pea te mäluhaldusest liiga palju hoolima. Kui komponent on vormile pandud, saab sellest vorm omanik ja vabastab komponendi võetud mälu, kui vorm on suletud (hävitatud). Vorm kui omanik vastutab hostitud komponentide mäluga seotud asukoha määramise eest. Lühidalt: vormi komponendid luuakse ja hävitatakse automaatselt
Näited mälulekke kohta
Mis tahes mittetriviaalses Delphi-rakenduses soovite Delphi komponendid kiirendada töö ajal. Teil on ka mõned oma kohandatud klassid. Oletame, et teil on klassi TDeveloper, millel on meetod DoProgram. Kui teil on vaja kasutada klassi TDeveloper, loote klassi esinemisjuhu, helistades Loo meetod (konstruktor). Meetod Loo loob uue objekti jaoks mälu ja tagastab objektile viite.
var
zarko: TDeveloper
alustada
zarko: = TMyObject. Loo;
zarko. DoProgram;
lõpp;
Ja siin on lihtne mälulekke!
Objekti loomisel peate käsutama mälu, mille see hõivas. Eraldatud objekti mälu vabastamiseks peate helistama Tasuta meetod. Et olla täiesti kindel, peaksite kasutama ka proovida / lõpuks blokeerida:
var
zarko: TDeveloper
alustada
zarko: = TMyObject. Loo;
proovida
zarko. DoProgram;
lõpuks
zarko. Tasuta;
lõpp;
lõpp;
See on näide turvalisest mälu eraldamisest ja tehingu asukoha koodist.
Mõned hoiatussõnad: kui soovite Delphi komponenti dünaamiliselt kiirendada ja millalgi hiljem selle selgesõnaliselt vabastada, andke omanikule alati null. Selle tegemata jätmine võib tekitada tarbetuid riske, samuti toimivuse ja koodi hooldamise probleeme.
Lisaks objektide loomisele ja hävitamisele meetodite Loo ja tasuta abil peate olema ka väga ettevaatlik, kui kasutate väliseid (faile, andmebaase jne) ressursse.
Oletame, et peate kasutama mõnda tekstifaili. Väga lihtsa stsenaariumi korral, kus ketta faili seostamiseks failiga kasutatakse meetodit AssignFile kui olete failiga lõpetanud, peate faili käepideme vabastamiseks helistama CloseFile kasutatud. Siin pole teil selget üleskutset "tasuta".
var
F: TextFile;
S: nöör;
alustada
AssignFile (F, 'c: \ somefile.txt');
proovida
Readln (F, S);
lõpuks
CloseFile (F);
lõpp;
lõpp;
Teine näide hõlmab väliste DLL-ide laadimist oma koodilt. LoadLibrary kasutamisel peate helistama FreeLibrary'le:
var
dllHandle: Thandle;
alustada
dllHandle: = Koormusraamatukogu ('MyLibrary. DLL ');
// tee selle DLL-iga midagi
kui dllHandle <> 0, siis FreeLibrary (dllHandle);
lõpp;
Mälulekked .NET-is?
Ehkki Delphi .NET-i korral haldab prügikoguja (GC) enamikku mäluülesandeid, on .NET-rakendustes võimalik mälulekked. Siin on artikkel arutelu GC Delphis .NET jaoks.
Kuidas võidelda mälulekke vastu
Lisaks moodulmälule ohutu koodi kirjutamisele saab mälulekke ära hoida ka mõne saadaval oleva kolmanda osapoole tööriista abil. Delphi Mälu lekke parandamise tööriistad aitab teil Delphi rakendust tabada vead nagu mälu riknemine, mälulekked, mälu jaotamise vead, muutuva vormindamise vead, muutuva definitsiooni konfliktid, osuti vead ja palju muud.