Kako otkriti curenje memorije u C/C++ s Valgrindom

Kako Otkriti Curenje Memorije U C C S Valgrindom



Valgrind je naširoko korišten alat za ispravljanje pogrešaka i profiliranje softverskih programa koji su primarno napisani na C, C++ i drugim jezicima. Pomaže programerima da otkriju curenje memorije, pronađu greške u pristupu memoriji i profiliraju izvođenje svojih programa.

Kada pokrenete program pod Valgrindom, on dinamički instrumentira izvršnu datoteku programa, dopuštajući mu da nadzire korištenje memorije programa i ponašanje pri izvršavanju.

Curenje memorije u C++

Važno je napomenuti da je Valgrind prvenstveno dizajniran za C i C++ programe i da možda neće raditi jednako učinkovito s drugim jezicima ili u svim scenarijima. Osim toga, pokretanje programa pod Valgrindom može značajno usporiti njegovo izvršenje, pa se često koristi tijekom razvoja i otklanjanja pogrešaka, a ne u proizvodnim okruženjima.







Kada se dinamički stvorena memorija ne oslobodi pravilno, može uzrokovati curenje memorije u C/C++ što će polako iscrpiti dostupne memorijske resurse. To može rezultirati prekomjernom potrošnjom memorije i lošijom izvedbom programa.



Valgrid instalacija

Da biste instalirali Valgrind na Linux sustav, otvorite terminal i ažurirajte svoja spremišta paketa pomoću upravitelja paketa koji je specifičan za vašu distribuciju Linuxa. Sljedeća naredba radi za Ubuntu i Debian temeljene sustave:



$ sudo prikladno ažuriranje

Koristite upravitelj paketa za instalaciju Valgrinda. Opet, naredba se može razlikovati ovisno o vašoj distribuciji Linuxa. Upotrijebite sljedeću naredbu za Ubuntu i sustave temeljene na Debianu:





$ sudo prikladan instalirati izborna vrata

Kada se to od vas zatraži, unesite svoju korisničku lozinku i pritisnite “Enter”. Imajte na umu da vaš korisnički račun treba administrativne ovlasti za instalaciju softvera. Upravitelj paketa preuzima i instalira Valgrind zajedno sa svim potrebnim ovisnostima. Proces može potrajati nekoliko minuta.



Nakon što je postupak instalacije završen, možete potvrditi uspješnu instalaciju Valgrinda izvršavanjem sljedeće naredbe kao korak provjere:

$ izborna vrata --verzija

Ova naredba prikazuje informacije o verziji Valgrinda ako je uspješno instaliran.

To je to! Valgrind bi sada trebao biti instaliran na vašem Linux sustavu i možete ga koristiti za analizu i otklanjanje pogrešaka u vašim C/C++ programima zbog curenja memorije i drugih problema.

Stvaranje datoteke u Ubuntuu

Da bismo počeli raditi na programu, prvo moramo stvoriti datoteku u Ubuntuu. Za izradu datoteka koristimo uređivač teksta nano. Dakle, pišemo naredbu na terminalu na sljedeći način:

$ nano datoteka1

Ovdje je nano naziv uređivača teksta koji se izvršava. Argument “file1” predstavlja naziv datoteke koju namjeravate otvoriti ili izraditi pomoću nano uređivača teksta. Nano otvara datoteku za uređivanje ako već postoji; ako nije, generira novu datoteku s navedenim imenom. Budući da nemamo takvu datoteku, stvara se novi dokument s nazivom 'file1'.

Nakon što pokrenete naredbu, otvorit će se nano editor, pružajući vam prazno platno za unos ili uređivanje sadržaja datoteke 'file1'. Možete početi upisivati ​​ili lijepiti postojeći sadržaj u uređivač.

Sada kada su svi preduvjeti postignuti, stvaramo neke primjere za korištenje Valgrinda za otkrivanje curenja memorije u C++ programima.

Primjer 1:

Prvi primjer koji nudimo demonstrira jednostavan primjer dinamičke dodjele memorije pomoću funkcije “malloc” iz biblioteke u C-u.

#include

int glavni ( )

{

char * a = malloc ( 102 ) ;

povratak 0 ;

}

Evo raščlambe koda:

Prvo uključujemo datoteku zaglavlja standardne biblioteke koja pruža funkcije poput malloc za dinamičku dodjelu i oslobađanje memorije.

Redak int main() deklarira glavnu funkciju. Zatim, char *a = malloc(102); deklarira pokazivačku varijablu “a” tipa char* (pokazivač na char). Koristi funkciju 'malloc' za dinamičku dodjelu memorije za niz od 102 char elementa (ukupno 102 bajta). Veličina dodijeljene memorije, izražena u bajtovima, šalje se kao ulaz u funkciju malloc i ona daje pokazivač na svježe stvoreni memorijski blok. Pokazivaču char* 'a' dodijeljena je vrijednost ovog pokazivača. Na kraju, 'povratak 0;' označava kraj glavne funkcije.

Ukratko, ovaj kod dinamički dodjeljuje memoriju za niz od 102 char elementa koristeći 'malloc' i dodjeljuje memorijsku adresu pokazivaču 'a'. Međutim, imajte na umu da kod ne koristi niti manipulira dodijeljenom memorijom ni na koji način i ne uključuje oslobađanje memorije koristeći free.

Kada pokrenemo ovaj program kroz Valgrind s opcijom “–leak-check=full”, on izvodi provjeru curenja memorije i daje izlazno izvješće.

Izlazno izvješće koje proizvodi Valgrid daje se kako slijedi:

Primjer 2:

Za početak ove ilustracije, prvo stvaramo datoteku 'test2' pomoću uređivača nano teksta kao što je prethodno objašnjeno pisanjem naredbe:

$ nano test2

Sada pišemo C++ program da provjerimo postoji li curenje memorije koristeći Valgrind:

#include

#include

#uključi

const int a_s = 3000 ;

int glavni ( ) {

int * ia = malloc ( veličina ( int ) * kao ) ;

za ( int i = 0 ; ja < kao; i++ ) {

to [ ja ] = i;

}

srand ( vrijeme ( NULL ) ) ;

int rn = rand ( ) % kao;

printf ( 'to[%d]: %d \n ' , rn, to [ rn ] ) ;

povratak 0 ;

}

Prođimo kroz program.

Kod uključuje potrebne datoteke zaglavlja i definira konstantnu varijablu 'a_s' s vrijednošću 3000. Unutar funkcije main(), deklariran je pokazivač 'ia' tipa int*, a memorija se dinamički dodjeljuje pomoću 'malloc' funkcija. Izraz “sizeof(int) * a_s” određuje ukupnu potrebnu memoriju za pohranjivanje broja cijelih brojeva “a_s”. Svi elementi niza 'ia' inicijaliziraju se petljom 'for' s odgovarajućom vrijednošću indeksa. Na primjer, ia[0] će biti 0, ia[1] će biti 1, i tako dalje.

Generator slučajnih brojeva postavlja se pomoću funkcije 'srand' koristeći trenutno vrijeme. Ovo osigurava da program proizvodi jedinstveni skup nasumičnih cijelih brojeva svaki put kada se izvrši. Funkcija 'rand' generira slučajni broj, a 'rn' se dodjeljuje rezultatu rand() % a_s. Operator modula “%” ograničava raspon slučajnog broja između 0 i a_s – 1 što odgovara važećem indeksu unutar polja “ia”.

Na kraju, program koristi funkciju 'printf' za ispis vrijednosti na nasumično odabranom indeksu 'rn' niza 'ia', zajedno s odgovarajućim indeksom.

Kada pokrenete ovaj program kroz Valgrind, on generira sljedeće izlazno izvješće:

  Snimka zaslona računalnog programa Opis automatski generiran

Zaključak

Otkrili smo korištenje alata Valgrind za otkrivanje curenja memorije u C++ programu. Vodič za instalaciju Valgrinda isporučuje se na početku. Nakon toga smo razradili stvaranje datoteke u Ubuntuu pomoću nano uređivača teksta. Na kraju, koristeći ove preduvjete, izvršili smo dva C++ primjera kako bismo provjerili curenje memorije u njima. Izvješće koje je generirao Valgrind također je priloženo i pokazuje curenje memorije u datoteci.