Com detectar fuites de memòria en C/C++ amb Valgrind

Com Detectar Fuites De Memoria En C C Amb Valgrind



Valgrind és una eina àmpliament utilitzada per depurar i perfilar els programes de programari que s'escriuen principalment en C, C++ i altres llenguatges. Ajuda als desenvolupadors a detectar fuites de memòria, rastrejar els errors d'accés a la memòria i perfilar l'execució dels seus programes.

Quan executeu un programa amb Valgrind, instrumenta dinàmicament l'executable del programa, cosa que li permet supervisar l'ús de la memòria i el comportament d'execució del programa.

Fuites de memòria en C++

És important tenir en compte que Valgrind està dissenyat principalment per a programes C i C++ i és possible que no funcioni tan eficaçment amb altres llenguatges o en tots els escenaris. A més, executar un programa amb Valgrind pot alentir significativament la seva execució, de manera que sovint s'utilitza durant el desenvolupament i la depuració més que en entorns de producció.







Quan una memòria creada dinàmicament no s'allibera correctament, pot provocar fuites de memòria en C/C++ que esgotaran lentament els recursos de memòria disponibles. Això pot provocar un consum excessiu de memòria i un rendiment degradat del programa.



Instal·lació de Valgrid

Per instal·lar Valgrind en un sistema Linux, obriu un terminal i actualitzeu els dipòsits de paquets mitjançant el gestor de paquets específic de la vostra distribució Linux. L'ordre següent funciona per a sistemes basats en Ubuntu i Debian:



$ sudo actualització apta

Utilitzeu el gestor de paquets per instal·lar Valgrind. De nou, l'ordre pot variar segons la vostra distribució de Linux. Utilitzeu l'ordre següent per als sistemes basats en Ubuntu i Debian:





$ sudo apt instal·lar porta electoral

Quan se us demani, introduïu la vostra contrasenya d'usuari i premeu 'Enter'. Tingueu en compte que el vostre compte d'usuari necessita privilegis administratius per instal·lar el programari. El gestor de paquets descarrega i instal·la Valgrind juntament amb les dependències necessàries. El procés pot trigar uns minuts.



Un cop finalitzat el procés d'instal·lació, podeu confirmar la instal·lació correcta de Valgrind executant l'ordre següent com a pas de verificació:

$ porta electoral --versió

Aquesta ordre mostra la informació de la versió de Valgrind si s'instal·la correctament.

Això és! Valgrind ara s'hauria d'instal·lar al vostre sistema Linux i podeu utilitzar-lo per analitzar i depurar els vostres programes C/C++ per detectar fuites de memòria i altres problemes.

Creació d'un fitxer a Ubuntu

Per començar a treballar en el programa, primer hem de crear un fitxer a Ubuntu. Per a la creació de fitxers, utilitzem l'editor de text nano. Per tant, escrivim l'ordre al terminal de la següent manera:

$ nano fitxer 1

Aquí, nano és el nom de l'editor de text que s'està executant. L'argument 'fitxer1' representa el nom del fitxer que voleu obrir o crear amb l'editor de text nano. Nano obre el fitxer per editar-lo si ja existeix; si no, genera un nou fitxer amb el nom proporcionat. Com que no tenim aquest fitxer, es crea un nou document amb el nom 'fitxer1'.

Un cop executeu l'ordre, s'obrirà l'editor nano i us proporcionarà un llenç en blanc per introduir o editar el contingut del fitxer 'fitxer1'. Podeu començar a escriure o enganxar el contingut existent a l'editor.

Ara que s'han assolit tots els requisits previs, creem alguns exemples per utilitzar Valgrind per detectar les fuites de memòria als programes C++.

Exemple 1:

El primer exemple que oferim demostra un exemple senzill d'assignació de memòria dinàmica mitjançant la funció 'malloc' de la biblioteca a C.

#include

int principal ( )

{

char * a = malloc ( 102 ) ;

tornar 0 ;

}

Aquí teniu un desglossament del codi:

Primer incloem el fitxer de capçalera de la biblioteca estàndard que proporciona funcions com malloc per a l'assignació i la desassignació de memòria dinàmica.

La línia int main() declara la funció principal. Aleshores, el caràcter *a = malloc(102); declara una variable punter “a” de tipus char* (punter a char). Utilitza la funció 'malloc' per assignar dinàmicament la memòria per a una matriu de 102 elements de caràcters (102 bytes en total). La mida d'assignació de memòria, expressada en bytes, s'envia com a entrada a la funció malloc i genera un punter al bloc de memòria acabat de crear. El punter char* 'a' té assignat aquest valor de punter. Finalment, el 'retorn 0;' significa el final de la funció principal.

En resum, aquest codi assigna dinàmicament la memòria per a una matriu de 102 elements de caràcters mitjançant 'malloc' i assigna l'adreça de memòria al punter 'a'. Tanmateix, tingueu en compte que el codi no utilitza ni manipula la memòria assignada de cap manera i no inclou la desassignació de la memòria utilitzant free.

Quan executem aquest programa a través de Valgrind amb l'opció '-leak-check=full', realitza una comprovació de fuites de memòria i proporciona un informe de sortida.

L'informe de sortida produït per Valgrid és el següent:

Exemple 2:

Per començar amb aquesta il·lustració, primer creem un fitxer 'test2' mitjançant l'editor de text nano tal com s'ha explicat anteriorment escrivint l'ordre:

$ nano prova 2

Ara, escrivim un programa C++ per comprovar si hi ha alguna pèrdua de memòria utilitzant Valgrind:

#include

#inclou

#inclou

const int a_s = 3000 ;

int principal ( ) {

int * ia = malloc ( mida de ( int ) * a_s ) ;

per ( int i = 0 ; i < a_s; i++ ) {

això [ i ] = i;

}

srand ( temps ( NUL ) ) ;

int rn = rand ( ) % a_s;

imprimirf ( 'ell[%d]: %d \n ' , rn, això [ rn ] ) ;

tornar 0 ;

}

Passem pel programa.

El codi inclou els fitxers de capçalera necessaris i defineix la variable constant “a_s” amb un valor de 3000. Dins de la funció main(), es declara un punter “ia” de tipus int* i la memòria s'assigna dinàmicament mitjançant el “malloc” funció. L'expressió 'sizeof(int) * a_s' determina la memòria total necessària per emmagatzemar el nombre 'a_s' d'enters. Tots els elements de la matriu 'ia' són inicialitzats pel bucle 'for' amb el seu valor d'índex corresponent. Per exemple, ia[0] serà 0, ia[1] serà 1, i així successivament.

El generador de números aleatoris es genera mitjançant la funció 'srand' utilitzant l'hora actual. Això assegura que el programa produeix un conjunt únic de nombres enters aleatoris cada vegada que s'executa. La funció 'rand' genera un nombre aleatori i 'rn' s'assigna amb el resultat de rand() % a_s. L'operador mòdul '%' limita l'interval del nombre aleatori entre 0 i a_s - 1 que correspon a un índex vàlid dins de la matriu 'ia'.

Finalment, el programa utilitza la funció 'printf' per imprimir el valor a l'índex 'rn' seleccionat aleatòriament de la matriu 'ia', juntament amb l'índex corresponent.

Quan executeu aquest programa mitjançant Valgrind, genera el següent informe de sortida:

  Una captura de pantalla d'un programa informàtic Descripció generada automàticament

Conclusió

Hem descobert la utilització de l'eina Valgrind per detectar les fuites de memòria en un programa C++. La guia d'instal·lació del Valgrind es proporciona inicialment. Després d'això, vam elaborar la creació d'un fitxer a Ubuntu mitjançant l'editor de text nano. Al final, utilitzant aquests requisits previs, vam executar dos exemples de C++ per comprovar les fuites de memòria. També s'adjunta l'informe que genera Valgrind que mostra les fuites de memòria al fitxer proporcionat.