Saltar a contenido

Última actualización:2026-10-12

Detección de fugas de memoria en C++

C++那些事: cómo detectar problemas de memoria

Al escribir código C/C++ los problemas de memoria están en todas partes; tanto en el trabajo como en las entrevistas, el tema de la memoria está siempre presente.

Hoy usamos un ejemplo para aprender paso a paso a detectar memoria en C++ con valgrind.

Simulamos tres problemas:

  • Detección de problemas de liberación de memoria
  • Detección de desbordamiento de escritura
  • Detección de desbordamiento de lectura

Aprenderás:

  • Cómo detectar estos tres problemas
  • Cómo depurar con gdb + valgrind a la vez

Bienvenido a la discusión.

1. Introducción del ejemplo

Mira el código siguiente: descubriremos que tiene muchos problemas:

  • strcpy no es seguro: sea cual sea el tamaño de la memoria, podría desbordarse
  • Al hacer print, msg accede fuera de rango
  • El destructor no libera la memoria

¿No se parece muchísimo al código que tú mismo escribiste alguna vez, jaja?

En esta sección vamos a detectar estos 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

Instalación de valgrind:

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

Para la instalación en más sistemas, consulta la dirección oficial:

https://valgrind.org/downloads/

3. Uso

Al compilar, se recomienda usar debug, -g, para así poder detectar en qué línea está el problema.

g++ val_test.cc -g

Después ejecutamos:

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

Y obtenemos la información que nos da valgrind:

detect

En ella podemos ver varios problemas:

  • Invalid write

Ocurre en val_test.cc::11

  • Invalid read

Ocurre en val_test.cc:10

  • Fuga de memoria

1 allocs, 0 frees, 3 bytes allocated.

Esta información nos permite localizar rápidamente qué línea de código tiene el problema.

4. Depuración con gdb

Si le añadimos --vgdb-error=0, podemos depurar el código con mucha comodidad, depurando mientras vemos dónde está el problema.

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

attach

A continuación entramos con gdb

gdb -q a.out

Pegamos en gdb la línea target anterior y luego continue; así veremos el código de la línea correspondiente junto con la información que valgrind sigue emitiendo.

gdb

continue

En esta sección hemos practicado con problemas de memoria; si te ha servido de ayuda, te invito a reenviarlo.

Temas relacionados

Comentarios