Pregunta

Cuando se usa malloc, si produce un volcado de núcleo con el error:

malloc(): memory corruption: ....... ***

¿Esto significa que malloc intentó asignar memoria que no era libre de asignar? Si es así, ¿cuáles son las causas de esto?

¿Fue útil?

Solución

Depende completamente de su implementación de malloc, pero generalmente lo que esto significa es que en algún momento antes de ese malloc algo escribió más datos en un búfer mal colocado que su tamaño.

Muchas implementaciones de malloc almacenan algunos de sus datos en línea con su memoria, en otras palabras:

+--------------------------------+
|14 bytes -> Padding             | 
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+
|6 bytes -> Your data            |
+--------------------------------+
|8 bytes -> Padding              |
+--------------------------------+
|2 bytes -> Internal malloc info |
+--------------------------------+

Entonces, si algún código suyo o una biblioteca escribiera 16 bytes en ese búfer de 6 bytes, sobrescribiría el relleno y los 2 bytes de información interna de malloc. La próxima vez que llame a malloc, intentará recorrer sus datos para encontrar espacio, presionar el espacio sobrescrito y no tendrá sentido ya que lo sobrescribió, corrompiendo el montón.

Dependiendo de la implementación, dicho error también podría ser causado al hacer un doble libre.

Otros consejos

Lo más probable es que esto no sea un problema en Malloc. Más bien, este es un problema con su aplicación modificando partes del montón que no debería.

Si está ejecutando en Linux, intente usar Valgrind para ver qué código está destruyendo su montón.

La causa habitual de esto es que usted escribió sobre los datos que malloc () no le dio permiso para escribir sobre ellos, ya sea desbordamiento del búfer (escribir más allá del final del espacio que se le dio) o agotamiento del búfer (escribir antes del inicio del búfer).

A veces puede ser causado al liberar un puntero que no fue asignado por malloc () et al, o al volver a liberar (doble liberación) un puntero que fue asignado por malloc (). Por ejemplo, liberar un búfer estático es una mala idea; obtendrá corrupción.

Debe suponer que el problema está en su código; es extremadamente improbable que sea un problema en malloc () y otros, y es bastante improbable que se encuentre en cualquier otra biblioteca que esté utilizando.

Hay varias cosas que son causas habituales de corrupción del montón:

  • desbordando la asignación de memoria (escribiendo más allá del final del bloque asignado)
  • doble liberación de un bloque
  • usando un puntero después de que se haya liberado
  • y, por supuesto, algo escrito erróneamente a través de un puntero que no tiene nada que ver con una asignación anterior (un "golpe de carnero" o un puntero falso): este es el caso general que incluye todo lo anterior.

Estos problemas pueden ser difíciles de depurar porque la causa y el efecto a menudo están separados por tiempo y espacio (área de código diferente). Entonces, el error no se nota hasta que pasa una eternidad (en tiempo de computadora) después de que se ejecuta el error que causó el problema.

Usar un montón de depuración puede ser muy útil para depurar estos problemas. Los compiladores de Microsoft tienen un CrtDebug heap que está habilitado en las versiones de depuración (pero puede tener elementos de configuración adicionales establecidos). No estoy seguro de lo que GCC tiene listo para usar, pero hay herramientas con las que estoy familiarizado al pasar, como Valgrind y valla eléctrica que podrían ayudar. Finalmente, hay un montón de bibliotecas de depuración de almacenamiento dinámico de origen propio que podrían ser útiles (Google alrededor).

¿Podría proporcionar su declaración malloc ()?

Además, ¿quería comprobar que el valor de retorno no sea nulo?

Además de no tener la memoria para asignar, los problemas que he encontrado al usar malloc () o new son similares a la naturaleza que mencionó donde realmente resultó Un montón corrupto. Por lo general, encuentro algunos "interesantes" código en otra parte del programa haciendo algo como memcpy () con un búfer de caracteres que causa un desbordamiento del búfer y un espacio de direcciones destrozado.

-bn

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top