Supraskite ir išvenkite atminties nutekėjimo Delfyje

DelfiObjektinio programavimo parama yra turtinga ir galinga. Klasės ir objektai leidžia programuoti modulinius kodus. Kartu su modulingesniais ir sudėtingesniais komponentais, jie yra sudėtingesni ir sudėtingesni klaidų.

Kol tobulėja paraiškos Delfuose yra (beveik) visada įdomus, būna situacijų, kai jautiesi kaip visas pasaulis prieš tave.

Kiekvieną kartą, kai jums reikia naudoti (sukurti) objektą „Delphi“, turite išlaisvinti jo sunaudotą atmintį (vieną kartą nebereikalingą). Žinoma, bandymai / pagaliau atminties apsaugos blokai gali padėti išvengti atminties nutekėjimo; vis tiek turite apsaugoti savo kodą.

Atminties (arba išteklių) nutekėjimas įvyksta, kai programa praranda galimybę atlaisvinti sunaudotą atmintį. Dėl pakartotinio atminties nutekėjimo proceso atmintis gali augti be apribojimų. Atminties nutekėjimas yra rimta problema - jei turite kodą, kuris sukelia atminties nutekėjimą, veikiančioje programoje 24/7, programa sunaudos visą turimą atmintį ir, pagaliau, mašina nustos reaguoti.

instagram viewer

Atminties nutekėjimas Delfyje

Pirmasis žingsnis siekiant išvengti atminties nutekėjimo yra suprasti, kaip jie atsiranda. Toliau bus aptariama keletas įprastų nesklandumų „Delphi“ kodo rašymo trūkumų ir geriausios praktikos pavyzdžiai.

Daugelyje (paprastų) „Delphi“ programų, kur naudojate komponentus (mygtukus, memus, redagavimus ir kt.), Kuriuos numesite formoje (projektavimo metu), jums nereikia per daug rūpintis atminties valdymu. Kai komponentas dedamas į formą, forma tampa ja savininkas ir atlaisvins atmintį, kurią užima komponentas, kai forma bus uždaryta (sunaikinta). Forma, kaip savininkas, yra atsakinga už komponentų, kuriuos ji priglobė, vietą atmintyje. Trumpai tariant: formos komponentai sukuriami ir sunaikinami automatiškai

Atminties nutekėjimo pavyzdžiai

Norėsite bet kurioje ne trivialioje „Delphi“ programoje pagreitinkite „Delphi“ komponentus. Jūs taip pat turėsite keletą savo pasirinktinių užsiėmimų. Tarkime, kad jūs turite klasės „TDeveloper“, turinčią metodą „DoProgram“. Dabar, kai jums reikia naudoti „TDeveloper“ klasę, sukuriate klasės egzempliorių, paskambinę Sukurti metodas (konstruktorius). Sukūrimo metodas skiria atmintį naujam objektui ir grąžina objekto nuorodą.

var
zarko: „TDeveloper“
prasideda
zarko: = TMyObject. Kurti;
zarko. „DoProgram“;
galas;

O štai paprastas atminties nutekėjimas!

Kurdami objektą turite atsikratyti jo užimtos atminties. Norėdami atlaisvinti atmintį paskirtą objektą, turite paskambinti Laisvas metodas. Norėdami būti visiškai tikri, turėtumėte naudoti ir pabandyti / pagaliau užblokuoti:

var
zarko: „TDeveloper“
prasideda
zarko: = TMyObject. Kurti;
bandyti
zarko. „DoProgram“;
pagaliau
zarko. Laisvas;
galas;
galas;

Tai saugaus atminties paskirstymo ir paskirstymo kodo pavyzdys.

Keli įspėjimo žodžiai: jei norite dinamiškai paversti „Delphi“ komponentą ir aiškiai jį atlaisvinti kada nors vėliau, visada perduokite nulį kaip savininką. To nepadarius, gali kilti nereikalingos rizikos, taip pat našumo ir kodo priežiūros problemų.

Be to, kad kuriate ir naikinate objektus naudodami „Create“ ir „Free“ metodus, turite būti labai atsargūs ir naudodami „išorinius“ (failus, duomenų bazes ir kt.) Išteklius.
Tarkime, kad turite veikti su kai kuriais tekstiniais failais. Labai paprastame scenarijuje, kai AssignFile metodas naudojamas susieti failą diske su failu kai baigsite naudoti failą, turite paskambinti „CloseFile“, kad būtų paleista failo tvarkyklė naudotas. Čia neturite aiškaus skambučio į „Nemokama“.

var
F: „TextFile“;
S: styga;
prasideda
„AssignFile“ (F, 'c: \ somefile.txt');
bandyti
Readln (F, S);
pagaliau
„CloseFile“ (F);
galas;
galas;

Kitas pavyzdys apima išorinių DLL įkėlimą iš savo kodo. Kai naudojate „LoadLibrary“, turite paskambinti „FreeLibrary“:

var
„dllHandle“: „Thandle“;
prasideda
dllHandle: = Krautuvų knyga ('MyLibrary. DLL ');
// ką nors padaryti su šiuo DLL
jei „dllHandle“> 0, tada „FreeLibrary“ („dllHandle“);
galas;

Atminties nutekėjimas .NET tinkle?

Nors naudojant „Delphi“ .NET šiukšlių surinkėjas (GC) valdo daugumą atminties užduočių, .NET programose gali būti atminties nutekėjimų. Štai straipsnio diskusija GC Delphi for .NET.

Kaip kovoti su atminties nutekėjimais

Be to, kad rašote modulinį saugų atminties kodą, atminties nutekėjimo galima išvengti naudojant kai kuriuos turimus trečiųjų šalių įrankius. Delfi Atminties nuotėkio taisymo įrankiai padės sugauti „Delphi“ programą klaidų tokias kaip atminties sugadinimas, atminties nutekėjimas, atminties paskirstymo klaidos, kintamos inicializacijos klaidos, kintamo apibrėžimo konfliktai, rodyklės klaidos ir dar daugiau.