Saprast un novērst atmiņas noplūdi Delfos

DelfiAtbalsts objektorientētajai programmēšanai ir bagātīgs un spēcīgs. Klases un objekti ļauj modulāru kodu programmēšanu. Kopā ar modulārākiem un sarežģītākiem komponentiem ir arī sarežģītāki un sarežģītāki komponenti bugs.

Kamēr attīstās lietojumprogrammas Delfos (gandrīz) vienmēr ir jautri, ir situācijas, kad jums liekas, ka visa pasaule ir pret jums.

Ikreiz, kad jums ir jāizmanto (jāizveido) objekts Delphi, jums ir jāatbrīvo tā patērētā atmiņa (vienreiz tas vairs nav vajadzīgs). Protams, mēģiniet / beidzot atmiņas aizsardzības bloki var palīdzēt novērst atmiņas noplūdi; jūsu kods joprojām ir jāaizsargā.

Atmiņas (vai resursa) noplūde rodas, kad programma zaudē spēju atbrīvot iztērēto atmiņu. Atkārtota atmiņas noplūde izraisa procesa atmiņas pieaugumu bez ierobežojumiem. Atmiņas noplūde ir nopietna problēma - ja lietojumprogrammā ir kods, kas izraisa atmiņas noplūdi 24/7, lietojumprogramma iztērēs visu pieejamo atmiņu un, visbeidzot, liks mašīnai reaģēt.

Atmiņas noplūde Delfos

Pirmais solis, lai izvairītos no atmiņas noplūdes, ir saprast, kā tie notiek. Tālāk ir diskusija par dažām izplatītām kļūdām un labāko praksi Delphi koda nenoplūdes rakstīšanai.

instagram viewer

Lielākajā daļā (vienkāršo) Delphi lietojumprogrammu, kurās izmantojat komponentus (pogas, piezīmes, labojumus utt.), Kurus nometat veidlapā (projektēšanas laikā), jums pārāk daudz nav jārūpējas par atmiņas pārvaldību. Kad komponents ir ievietots veidlapā, forma kļūst par to īpašnieks un pēc brīvas formas aizvēršanas (iznīcināšanas) tiks atbrīvota komponenta atmiņa. Forma kā īpašnieks ir atbildīgs par tajā mitināto komponentu izvietošanu atmiņā. Īsumā: veidlapas komponenti tiek automātiski izveidoti un iznīcināti

Atmiņas noplūdes piemēri

Jebkurā ne-triviālā Delphi lietojumprogrammā jūs to vēlēsities tūlītēju Delphi komponentu izpildi. Jums būs arī dažas no savām klasēm. Pieņemsim, ka jums ir klases TDeveloper, kurai ir metode DoProgram. Tagad, kad jums jāizmanto klase TDeveloper, jūs izveidojat klases instanci, piezvanot Izveidot metode (konstruktors). Metode Izveidot piešķir atmiņu jaunam objektam un atgriež atsauci uz objektu.

var
zarko: TDeveloper
sākt
zarko: = TMyObject. Izveidot;
zarko. DoProgram;
beigas;

Un šeit ir vienkārša atmiņas noplūde!

Kad izveidojat objektu, jums ir jāiznīcina tā aizņemtā atmiņa. Lai atbrīvotu atmiņu piešķirtajam objektam, jums jāzvana Bezmaksas metode. Lai būtu pilnīgi pārliecināts, jums vajadzētu izmantot arī izmēģināt / beidzot bloķēt:

var
zarko: TDeveloper
sākt
zarko: = TMyObject. Izveidot;
mēģiniet
zarko. DoProgram;
beidzot
zarko. Bezmaksas;
beigas;
beigas;

Šis ir drošas atmiņas piešķiršanas un darījuma piešķiršanas koda piemērs.

Daži brīdinājuma vārdi: ja vēlaties dinamiski padarīt Delphi komponentu tūlītēju un kādu brīdi to skaidri atbrīvot, vienmēr nodot nulli kā īpašnieku. To nedarot, var rasties nevajadzīgs risks, kā arī veiktspējas un koda uzturēšanas problēmas.

Papildus objektu izveidošanai un iznīcināšanai, izmantojot metodes Izveidot un Bezmaksas, jums jābūt arī ļoti piesardzīgiem, lietojot “ārējos” (failus, datu bāzes utt.) Resursus.
Pieņemsim, ka jums ir jādarbojas ar kādu teksta failu. Ļoti vienkāršā scenārijā, kad AssignFile metode tiek izmantota, lai diskā pievienotu failu ar failu Kad esat pabeidzis faila izveidi, jums jāizsauc CloseFile, lai sāktu faila apstrādātāju izmanto. Šeit jums nav tieša zvana uz “Bezmaksas”.

var
F: TextFile;
S: aukla;
sākt
AssignFile (F, 'c: \ somefile.txt');
mēģiniet
Readlns (F, S);
beidzot
CloseFile (F);
beigas;
beigas;

Cits piemērs ietver ārēju DLL ielādi no koda. Ikreiz, kad lietojat LoadLibrary, jums jāizsauc FreeLibrary:

var
dllHandle: trīsstūris;
sākt
dllHandle: = Loadlibrary ('MyLibrary. DLL ');
// kaut ko darīt ar šo DLL
ja dllHandle <> 0, tad FreeLibrary (dllHandle);
beigas;

Atmiņas noplūde .NET?

Lai gan Delphi for .NET atkritumu savācējs (GC) pārvalda lielāko daļu atmiņas uzdevumu, .NET lietojumprogrammās ir iespējama atmiņas noplūde. Šeit ir raksta diskusija GC Delphi domēnā .NET.

Kā cīnīties pret atmiņas noplūdi

Papildus modulāra, atmiņai droša koda rakstīšanai, atmiņas noplūdes novēršanu var veikt, izmantojot dažus pieejamos trešo pušu rīkus. Delfi Atmiņas noplūdes labošanas rīki palīdzēs jums noķert Delphi lietojumprogrammu kļūdas piemēram, atmiņas bojājumi, atmiņas noplūdes, atmiņas piešķiršanas kļūdas, mainīgas inicializācijas kļūdas, mainīgu definīciju konflikti, rādītāja kļūdas un daudz kas cits.