Cada bloque de memoria asignada dentro de un almacenamiento dinámico consta de un área de datos, que empieza en la dirección devuelta por la función asignadora, y de un área de control adyacente al área de datos, que es necesaria para que las funciones de gestión de memoria puedan liberar adecuadamente la memoria cuando el usuario la desasigna. Si sobrescribe una estructura de control del almacenamiento dinámico (por ejemplo, escribiendo en elementos situados fuera de los límites asignados de una matriz, o copiando una serie en un bloque de memoria asignada demasiado pequeño), la información de control se daña y puede provocar un comportamiento de programa incorrecto aunque no se sobrescriban las áreas de datos de otros bloques asignados.
Cuando intente localizar errores de almacenamiento dinámico, tenga en cuenta los puntos siguientes:
Para detectar errores de almacenamiento dinámico, puede compilar el programa de forma que utilice las versiones de comprobación de almacenamiento dinámico de las funciones de gestión de memoria (para obtener información acerca de la opción de compilador -qheapdebug, consulte el tema relacionado con las opciones de compilador para la depuración). Al ejecutar un programa compilado con esta opción, cada llamada a una función de gestión de memoria provoca la realización de una comprobación de almacenamiento dinámico en el almacenamiento dinámico predeterminado. Esta comprobación de almacenamiento dinámico implica comprobar las estructuras de control de cada bloque de memoria asignado dentro del almacenamiento dinámico y asegurarse de que ninguna de ellas se ha sobrescrito. Si se encuentra un error, el programa termina y se escribe información en la salida de errores estándar, que incluye la dirección en la que se ha producido el daño del almacenamiento dinámico, el archivo fuente y el número de línea en los que se ha detectado por última vez un estado de almacenamiento dinámico válido y el archivo fuente y número de línea en los que se ha detectado el error de memoria.
La comprobación de almacenamiento dinámico sólo se habilita para el almacenamiento dinámico predeterminado utilizado por cada ejecutable. Si las versiones de depuración de las funciones de gestión de memoria no notifican daños en el almacenamiento dinámico y sigue sospechando que existe un problema, puede que esté utilizando almacenamientos dinámicos adicionales y que los esté dañando.
Puede determinar la causa de un error de almacenamiento dinámico desde el interior del depurador, siempre que el almacenamiento dinámico que provoca el error sea el almacenamiento dinámico predeterminado, reduciendo constantemente el espacio entre la última línea en la que el almacenamiento dinámico era válido y la primera línea en la que se ha producido el daño. Utilice una combinación de mandatos de ejecución (run), mandatos de recorrido (step), puntos de interrupción de línea y de función y el valor Realizar comprobación de almacenamiento dinámico al detener para reducir el ámbito de la búsqueda. Para obtener información acerca de este valor, consulte el tema relacionado.
En programas semánticamente incorrectos, el valor Realizar comprobación de almacenamiento dinámico al detener es intrusivo en el sentido de que puede producir resultados diferentes cuando un programa accede incorrectamente a los datos de la pila. Esto se debe a que Realizar comprobación de almacenamiento dinámico al detener hace que el proceso y la hebra que se depuran llamen a una función de comprobación de almacenamiento dinámico cada vez que la ejecución se detiene, y esta función de comprobación de almacenamiento dinámico afecta al área segura de la pila sobrescribiendo parte de dicha área con su marco de pila. Por ejemplo, si una función a la que se ha llamado devuelve la dirección de una variable local, el contenido de ésta es accesible desde la función llamante, y no cambia, siempre y cuando el marco de pila utilizado por la función llamada no quede sobrescrito por una llamada subsiguiente. Sin embargo, si emite una llamada recorrer hasta retorno desde la función llamada estando habilitado Realizar comprobación de almacenamiento dinámico al detener, la función de comprobación de almacenamiento dinámico se llama inmediatamente al retorno de la función llamada, y la memoria a la que señala el puntero devuelto puede haber quedado sobrescrita por el marco de pila de la función de comprobación de almacenamiento dinámico.
La comprobación de almacenamiento dinámico dentro del depurador tiene un alto coste de sobrecarga en los mandatos de recorrido, ya que el almacenamiento dinámico se comprueba después de cada recorrido. Si recorre paso a paso grandes secciones de código o se detiene con frecuencia en puntos de interrupción, y observa que el rendimiento de la depuración es demasiado lento, intente activar Realizar comprobación de almacenamiento dinámico al detener sólo en aquellas áreas que sospeche que están provocando errores de almacenamiento dinámico.