Kas yra atminties nutekėjimas programuojant C

Kas Yra Atminties Nutekejimas Programuojant C



Programavimo pagrindai apima atminties valdymą, ypač tokiomis kalbomis kaip C be integruoto šiukšlių rinktuvo. Atminties nutekėjimas yra dažna problema tokiomis kalbomis ir dėl jų programa sunaudoja vis daugiau atminties, kol programa sugenda dėl atminties trūkumo. Kai programinei įrangai nepavyksta atlaisvinti nebereikalingos atminties, atmintis paskirstoma ir nenaudojama, todėl atminties nutekėjimas .

Kada atsiranda atminties nutekėjimas?

Kai programinė įranga paskirsto atmintį, bet jos neišleidžia, kai ją baigia, atsiranda a atminties nutekėjimas . Tai reiškia, kad programa ir toliau skiria vis daugiau atminties naujiems kintamiesiems, o senoji atmintis lieka paskirstyta ir nenaudojama. Dėl to programa naudoja vis daugiau atminties ir galiausiai programa sugenda dėl atminties trūkumo klaidos.

Atminties nutekėjimo poveikis C

Atminties nutekėjimas gali sukelti daug problemų programoje. Jei nepažymėta, a atminties nutekėjimas programa gali sugesti arba nustoti veikti, o tai gali sukelti duomenų praradimą arba sugadinimą. Be to, kadangi programa sunaudoja daugiau atminties nei jai reikia, ji gali turėti įtakos sistemos veikimui ir gali sulėtinti kitų toje pačioje sistemoje veikiančių programų.







Atminties paskirstymas C kalba

Atminties paskirstymas atliekamas naudojant malloc () funkcija C kalba. Šis metodas grąžina nuorodą į nurodyto dydžio atminties bloką. Rodyklės reikšmė naudojama norint pasiekti skirtą atminties bloką. Kai atmintis nereikalinga, ją reikia atlaisvinti naudojant Laisvas() funkcija.



Atminties nutekėjimo priežastys

Kai kurios priežastys, dėl atminties nutekėjimas yra:



1: Netinkamas atminties valdymas

Dažniausia atminties nutekėjimo priežastis yra blogas programuotojo atminties valdymas. Taip atsitinka, kai programa nepaleidžia atminties, kurios nebereikia.





#include
#include

tarpt pagrindinis ( )
{
tarpt * ptr = ( tarpt * ) malloc ( dydis ( tarpt ) ) ;
* ptr = 10 ;
printf ( „%d \n , * ptr ) ;
ptr = NULL ;
grąžinti 0 ;
}

Aukščiau pateiktame kode naudodami malloc () metodas ptr žymeklį, skyrėme vietos sveikųjų skaičių atminties blokui. The ptr rodyklės reikšmė pasikeičia, kai nustatome NULL į jį, tačiau atminties blokas, į kurį anksčiau buvo nuoroda, nėra paleistas. Todėl a atminties nutekėjimas bus rezultatas.

Išvestis



2: netaikomas žymeklis

Kai yra žymeklio kintamasis, jo apimtis, a atminties nutekėjimas pasitaiko C programose.

#include
#include

tarpt pagrindinis ( )
{
tarpt skaičius1 = 32 , skaičius2 = 23 ;
{
tarpt * suma = ( tarpt * ) malloc ( dydis ( tarpt ) ) ;
* suma = skaičius1 + skaičius2 ;
printf ( „%d \n , * suma ) ;
}
printf ( „%d \n , * suma ) ;
grąžinti 0 ;
}

Aukščiau esančioje C programoje pagrindinis () funkcija naudoja vietinę sritį, kad priskirtų sveikųjų skaičių atminties bloką suma rodyklės kintamasis. Kadangi mes panaudojome suma žymeklį, kad naujai suformuotam atminties blokui priskirtų a ir b papildymą, atminties blokas nuolat paskirstomas net ir pasibaigus bloko apimčiai. Todėl a atminties nutekėjimas atsiras.

Išvestis

Atminties nutekėjimo aptikimas C

Aptikimas ir prevencija atminties nutekėjimas yra labai svarbūs norint išlaikyti programos stabilumą ir našumą. Aptikti atminties nutekėjimas , programuotojai gali naudoti tokius įrankius kaip Rinkimų vartai , atminties derinimo ir profiliavimo įrankis. Rinkimų vartai padeda nustatyti atminties nutekėjimą, sekdamas visas programos atminties prieigas ir nustatydamas, kada skirta atmintis neatlaisvinama.

Atminties nutekėjimo prevencija C

Apsaugoti atminties nutekėjimas , vadovaukitės toliau pateiktomis instrukcijomis.

1: Visada atleiskite paskirtą atmintį
Atmintis visada turi būti aiškiai atlaisvinta naudojant Laisvas() metodas, kai jis buvo dinamiškai paskirstytas naudojant tokią funkciją kaip malloc(), calloc() arba realloc() . Tai darant įsitikinama, kad atmintis grąžinama į sistemą ir yra prieinama kitiems tikslams.

2: Paskirstytos atminties stebėjimas
Paskirstytos atminties stebėjimas yra svarbus siekiant užtikrinti, kad ji būtų atlaisvinta, kai jos nebereikia. Tai galima pasiekti stebint kiekvieną paskirtą atmintį ir išleidžiant ją, kai jos nebereikia.

3: Sekite rodykles
Rodyklės turėtų būti sekamos, kad būtų automatiškai valdomas atminties paskirstymas ir atskyrimas, kad būtų išvengta atminties nutekėjimo.

4: naudokite statinės analizės įrankius
Sukūrimo metu statinės analizės įrankiai gali nustatyti galimą atminties nutekėjimas C programose, tokiose kaip Clang ir GCC. Prieš paleidžiant programą, šie įrankiai gali padėti surasti galimus atminties nutekėjimus ir pateikti taisymo pasiūlymus.

Šis pavyzdys iliustruoja aukščiau aprašytą procesą.

#include
#include
#include

tarpt pagrindinis ( )
{
tarpt * ptr = ( tarpt * ) malloc ( dydis ( tarpt ) ) ;
jeigu ( ptr == NULL ) {
printf ( 'Atminties paskirstymo klaida. \n ) ;
grąžinti 1 ;
}
* ptr = 10 ;
printf ( „%d \n , * ptr ) ;
Laisvas ( ptr ) ;
grąžinti 0 ;
}

Šis aukščiau pateiktas kodas pirmiausia nustato, ar atminties paskirstymas buvo sėkmingas, patikrinant, ar ptr nuoroda nėra NULL . Jei paskirstymas nepavyks, kodas gali tinkamai apdoroti klaidą. Jei paskirstymas buvo sėkmingas, kodas suteikia atminties blokui reikšmę 10 ir jį išveda. Po to kodas išleidžia atmintį, kuri buvo skirta naudojant Laisvas() funkcija.

Išvestis

Išvada

Atminties nutekėjimas gali sukelti didelių problemų programose, įskaitant našumo pablogėjimą ir gedimus. Tokias problemas galima nustatyti ir jų išvengti kruopščiai valdant atmintį, tinkamai testuojant ir stebint atminties naudojimą. Todėl programuotojai turi žinoti apie galimą atminties nutekėjimą ir imtis būtinų veiksmų, kad jų išvengtų.