Habilitar la detección de pérdidas de memoria

Actualización: noviembre 2007

Este tema es aplicable a:

Edición

Visual Basic

C#

C++

Web Developer

Express

Sólo para código nativo

Standard

Sólo para código nativo

Pro y Team

Sólo para código nativo

Leyenda de la tabla:

Se aplica

No procede

Comando o comandos ocultos de manera predeterminada.

Las herramientas principales para detectar pérdidas de memoria son el depurador y las funciones del montón de depuración de las bibliotecas en tiempo de ejecución de C (CRT). Para habilitar las funciones del montón de depuración, incluya las siguientes instrucciones en el programa:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
Nota:

Las instrucciones #include deben aparecer en el orden indicado aquí. Si cambia el orden, puede que las funciones que utilice no funcionen correctamente.

Si se incluye crtdbg.h, las funciones malloc y free se asocian con sus versiones de depuración, _malloc_dbg y _free_dbg, las cuales realizan un seguimiento de la asignación y desasignación de memoria. Esta correspondencia de funciones sólo se produce en una versión de depuración (en la cual está definida _DEBUG). Las versiones de lanzamiento utilizan las funciones normales malloc y free.

La instrucción #define asocia las versiones base de las funciones del montón de CRT con las correspondientes versiones de depuración. Esta instrucción no se necesita realmente, pero sin ella, el volcado de pérdida de memoria contendrá menos información útil.

Una vez agregadas las instrucciones anteriores, se puede volcar la información de pérdida de memoria incluyendo la siguiente instrucción en el programa:

_CrtDumpMemoryLeaks();

Cuando se ejecuta el programa con el depurador, _CrtDumpMemoryLeaks muestra la información de pérdida de memoria en la ventana Resultados. La información de pérdida de memoria tiene el siguiente aspecto:

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Si no utiliza la instrucción #define _CRTDBG_MAPALLOC, el volcado de pérdida de memoria tendría el siguiente aspecto:

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Si no se ha definido _CRTDBG_MAP_ALLOC, la pantalla muestra:

  • El número de asignación de memoria (entre llaves).

  • El tipo de bloque, que es normal, cliente o CRT.

  • La posición de memoria en formato hexadecimal.

  • El tamaño del bloque en bytes.

  • El contenido de los 16 primeros bytes, también en forma hexadecimal.

Si se ha definido _CRTDBG_MAP_ALLOC, la pantalla también muestra el archivo donde se asignó la memoria perdida. El número entre paréntesis que sigue al nombre de archivo (20, en este ejemplo) es el número de línea dentro del archivo.

Para ir a la línea del archivo de código fuente donde se asignó la memoria

  • Haga doble clic en la línea de la ventana Resultados que contiene el nombre de archivo y el número de línea.

    O bien

    Seleccione la línea de la ventana Resultados que contiene el nombre de archivo y el número de línea, y presione F4.

_CrtSetDbgFlag

Llamar a _CrtDumpMemoryLeaks es bastante fácil si el programa termina siempre en el mismo lugar. Si su programa puede terminar en varios lugares, en vez de colocar una llamada a _CrtDumpMemoryLeaks en cada uno de esos lugares posibles, se puede incluir la siguiente llamada al principio del programa:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Esta instrucción llama automáticamente a _CrtDumpMemoryLeaks cuando el programa termina. Se deben establecer ambos campos de bits, _CRTDBG_ALLOC_MEM_DF y _CRTDBG_LEAK_CHECK_DF, como se ha mostrado anteriormente.

Establecer el modo de informe de CRT

De forma predeterminada, _CrtDumpMemoryLeaks vuelca información sobre la pérdida de memoria en el panel Depuración de la ventana Resultados, como se ha descrito anteriormente. Se puede hacer que el volcado se produzca en otra ubicación mediante _CrtSetReportMode. Si se utiliza una biblioteca, ésta puede hacer que se envíen los resultados a otra ubicación. En ese caso, se puede devolver la ubicación de los resultados a la ventana Resultados mediante la siguiente instrucción:

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

Para obtener más información, vea _CrtSetReportMode.

Vea también

Conceptos

Detección y aislamiento de pérdidas de memoria