Ir para o conteúdo

Última atualização:2026-10-12

Detecção de Vazamentos de Memória em C++

C++那些事: como detectar problemas de memória

Ao escrever código C/C++, problemas de memória estão por toda parte; seja no trabalho ou em entrevistas, o tema memória está sempre presente.

Hoje usaremos um exemplo para aprender passo a passo a detectar memória em C++ com o valgrind.

Simulamos três problemas:

  • detecção de liberação de memória
  • detecção de estouro de escrita
  • detecção de estouro de leitura

Você aprenderá:

  • como detectar esses três problemas
  • como usar gdb + valgrind juntos para depurar

Fique à vontade para discutir.

1.Exemplo de introdução

Olhe o código abaixo; perceberemos muitos problemas:

  • strcpy não é seguro: qual o tamanho adequado de memória? pode ultrapassar limites
  • acesso fora dos limites de msg no print
  • o destruidor não libera a memória

Parece muito aquele código que você mesmo já escreveu, haha.

Esta seção detectará esses problemas.

class Message {
private:
    char *msg;

public:
    Message(const char *text) {
        msg = new char[3];
        std::strcpy(msg, text);
    }

    void printOutOfRange() {
        std::cout << msg[5] << std::endl;
    }

    ~Message() {

    }
};

int main() {
    Message message("hello");
    message.printOutOfRange();

    return 0;
}

2.valgrind

Instalação do valgrind:

brew install valgrind // mac
sudo apt-get install install // ubuntu

Para outros sistemas, consulte o endereço oficial:

https://valgrind.org/downloads/

3.Uso

Ao compilar, recomenda-se usar debug, -g, para que seja possível detectar em qual linha está o problema.

g++ val_test.cc -g

Em seguida executamos:

valgrind --leak-check=full ./a.out 

Obtemos então as informações que o valgrind nos fornece:

detect

Neste ponto podemos ver vários problemas:

  • Invalid write

ocorre em val_test.cc::11

  • Invalid read

ocorre em val_test.cc:10

  • vazamento de memória

1 allocs, 0 frees, 3 bytes allocated.

Essas informações permitem localizar rapidamente qual linha do código tem problema.

4.Depuração com gdb

Ao adicionarmos --vgdb-error=0, podemos depurar o código com facilidade, depurando e ao mesmo tempo vendo onde está o problema.

valgrind --leak-check=full --vgdb-error=0 ./a.out 

attach

Em seguida, anexamos o gdb

gdb -q a.out

Cole no gdb a linha "target" acima e continue; poderemos ver o código da linha correspondente, e o valgrind continuará emitindo informações.

gdb

continue

Esta seção trouxe uma prática de problemas de memória; se ajudou você, compartilhe.

Tópicos relacionados

Comentários