Quando você executa um programa no Valgrind, ele instrumenta dinamicamente o executável do programa, permitindo monitorar o uso de memória e o comportamento de execução do programa.
Vazamentos de memória em C++
É importante observar que Valgrind foi projetado principalmente para programas C e C++ e pode não funcionar de forma tão eficaz com outras linguagens ou em todos os cenários. Além disso, a execução de um programa no Valgrind pode retardar significativamente sua execução, por isso é frequentemente usado durante o desenvolvimento e a depuração, e não em ambientes de produção.
Quando uma memória criada dinamicamente não é liberada corretamente, pode causar vazamentos de memória em C/C++, o que drenará lentamente os recursos de memória disponíveis. Isso pode resultar em consumo excessivo de memória e degradação do desempenho do programa.
Instalação Valgrid
Para instalar o Valgrind em um sistema Linux, abra um terminal e atualize seus repositórios de pacotes usando o gerenciador de pacotes específico para sua distribuição Linux. O seguinte comando funciona para sistemas baseados em Ubuntu e Debian:
$ sudo atualização adequada
Use o gerenciador de pacotes para instalar o Valgrind. Novamente, o comando pode variar dependendo da sua distribuição Linux. Use o seguinte comando para sistemas baseados em Ubuntu e Debian:
$ sudo apto instalar portão eleitoral
Quando solicitado, digite sua senha de usuário e pressione “Enter”. Observe que sua conta de usuário precisa de privilégios administrativos para instalar o software. O gerenciador de pacotes baixa e instala o Valgrind junto com todas as dependências necessárias. O processo pode demorar alguns minutos.
Após a conclusão do processo de instalação, você pode confirmar o sucesso da instalação do Valgrind executando o seguinte comando como etapa de verificação:
$ portão eleitoral --versãoEste comando exibe as informações da versão do Valgrind se ele for instalado com sucesso.
É isso! Valgrind agora deve estar instalado em seu sistema Linux e você pode usá-lo para analisar e depurar seus programas C/C++ em busca de vazamentos de memória e outros problemas.
Criando um arquivo no Ubuntu
Para começar a trabalhar no programa, primeiro precisamos criar um arquivo no Ubuntu. Para criação de arquivos, usamos o editor de texto nano. Então, escrevemos o comando no terminal da seguinte forma:
$ nano arquivo1Aqui, nano é o nome do editor de texto que está sendo executado. O argumento “file1” representa o nome do arquivo que você pretende abrir ou criar usando o editor de texto nano. Nano abre o arquivo para edição se ele já existir; caso contrário, gera um novo arquivo com o nome fornecido. Como não temos esse arquivo, ele cria um novo documento com o nome “arquivo1”.
Depois de executar o comando, o editor nano será aberto, fornecendo uma tela em branco para inserir ou editar o conteúdo do arquivo “file1”. Você pode começar a digitar ou colar o conteúdo existente no editor.
Agora que todos os pré-requisitos foram alcançados, criamos alguns exemplos de uso do Valgrind para detectar vazamentos de memória em programas C++.
Exemplo 1:
O primeiro exemplo que fornecemos demonstra um exemplo simples de alocação dinâmica de memória usando a função “malloc” da biblioteca
interno principal ( )
{
Caracteres * a = maloc ( 102 ) ;
retornar 0 ;
}
Aqui está um detalhamento do código:
Primeiro incluímos o arquivo de cabeçalho da biblioteca padrão
A linha int main() declara a função principal. Então, o char *a = malloc(102); declara uma variável ponteiro “a” do tipo char* (ponteiro para char). Ele usa a função “malloc” para alocar dinamicamente a memória para um array de 102 elementos char (102 bytes no total). O tamanho da alocação de memória, expresso em bytes, é enviado como uma entrada para a função malloc e gera um ponteiro para o bloco de memória recém-criado. O ponteiro char* “a” recebe este valor de ponteiro. Por último, o “retorno 0;” significa o fim da função principal.
Resumindo, este código aloca dinamicamente a memória para um array de 102 elementos char usando “malloc” e atribui o endereço de memória ao ponteiro “a”. No entanto, observe que o código não usa ou manipula a memória alocada de forma alguma e não inclui a desalocação da memória usando free.
Quando executamos este programa através do Valgrind com a opção “–leak-check=full”, ele realiza uma verificação de vazamento de memória e fornece um relatório de saída.
O relatório de saída produzido pelo Valgrid é fornecido da seguinte forma:
Exemplo 2:
Para começar com esta ilustração, primeiro criamos um arquivo “test2” usando o editor de texto nano conforme explicado anteriormente escrevendo o comando:
$ nano teste2Agora, escrevemos um programa C++ para verificar se há algum vazamento de memória usando Valgrind:
#include#include
#include
const int a_s = 3.000 ;
principal interno ( ) {
interno * ia = malloc ( tamanho de ( interno ) * como ) ;
para ( int eu = 0 ; eu < como; eu++ ) {
isto [ eu ] = eu;
}
areia ( tempo ( NULO ) ) ;
int rn = rand ( ) % como;
imprimir ( 'isso[%d]: %d \n ' , rn, isso [ rn ] ) ;
retornar 0 ;
}
Vamos passar pelo programa.
O código inclui os arquivos de cabeçalho necessários e define a variável constante “a_s” com valor 3000. Dentro da função main(), um ponteiro “ia” do tipo int* é declarado e a memória é alocada dinamicamente usando o “malloc” função. A expressão “sizeof(int) * a_s” determina a memória total necessária para armazenar o número “a_s” de inteiros. Todos os elementos do array “ia” são inicializados pelo loop “for” com seu valor de índice correspondente. Por exemplo, ia[0] será 0, ia[1] será 1 e assim por diante.
O gerador de números aleatórios é propagado usando a função “srand” usando a hora atual. Isso garante que o programa produza um conjunto exclusivo de inteiros aleatórios cada vez que for executado. A função “rand” gera um número aleatório e “rn” é atribuído com o resultado de rand()% a_s. O operador de módulo “%” limita o intervalo do número aleatório entre 0 e a_s – 1, que corresponde a um índice válido dentro da matriz “ia”.
Por fim, o programa usa a função “printf” para imprimir o valor no índice “rn” selecionado aleatoriamente do array “ia”, junto com o índice correspondente.
Ao executar este programa através do Valgrind, ele gera o seguinte relatório de saída:
Conclusão
Descobrimos a utilização da ferramenta Valgrind para detectar vazamentos de memória em um programa C++. O guia de instalação do Valgrind é fornecido inicialmente. Em seguida, elaboramos a criação de um arquivo no Ubuntu utilizando o editor de texto nano. No final, usando esses pré-requisitos, executamos dois exemplos de C++ para verificar vazamentos de memória neles. Também está anexado o relatório gerado pelo Valgrind que mostra os vazamentos de memória no arquivo fornecido.