Pregunta

Sé que esto es realmente general, pero obtengo "esto" (ver más abajo) cuando ejecuto mi archivo .c en Visual C ++ 2008 Express. Sucede cuando llamo malloc (). Tome mi trabajo en esto: asigno dinámicamente la memoria correctamente.

Heap [Code.exe]: Heap: Bloque de montón gratuito 211A10 modificado en 211F8 Después de que se liberó, Windows ha activado un punto de interrupción en Code.exe.

Esto puede deberse a una corrupción del montón, que indica un error en código.exe o cualquiera de las dlls que ha cargado.

Esto también puede deberse a que el usuario presiona F12 mientras que Code.exe tiene enfoque.

La ventana de salida puede tener más información de diagnóstico.

¿Por qué recibo este error? ¿Qué significa esto incluso?

¿Fue útil?

Solución

El mensaje de error te dice exactamente por qué lo tienes:

Bloque de montón gratuito 211A10 modificado en 211F8 después de que fue liberado

Tenías un bloque asignado por el montón que fue liberado y luego algo escribió en esa área de memoria. No es agradable escribir en un bloque de memoria liberado.

Otros consejos

El error no es en realidad sucediendo Cuando llamas a Malloc; Eso es justo cuando desencadena un escaneo de montón gratis. El error real ocurrió en algún lugar antes. Usted machecó algo de memoria en la dirección 211A10 (eso es lo que Malloc le devolvió). Entonces usted (o algún otro lib) lo liberó. Luego, cuando llamas a Malloc en modo de depuración, escanea todo el montón, como cortesía para ti, el pobre programador. Descubre que alguien (su o alguna lib es que llame) escribió sobre parte de esa matriz, específicamente en la dirección 211AF8, o 0xe8 bytes en la matriz. Por lo tanto, todavía estás colgado de un puntero que ha sido liberado (muy probablemente) y lo usas, o solo estás destrozando la memoria aleatoria.

En mi caso, con síntomas similares, el problema era el desajuste de alineación de estructuras (/zp)

Definí para mi código una alineación de estructura diferente a las bibliotecas externas (wxwidgets). Sin embargo, WXWidgets se construyó con Makefile, por lo que se compiló utilizando DeFaut /ZP. Y wxwidget está estáticamente vinculado.

Puedes hacer eso, pero si intentas eliminar un objeto wxwidgets-class De tu código El compilador se confunde sobre el tamaño exacto de los miembros de Struct. Y cuando se ejecuta, recibe este mensaje:

HEAP[Code.exe]: HEAP: Free Heap block 211a10 modified at 211af8 after it was freed 
Windows has triggered a breakpoint in Code.exe.

Solución:

  • Asegúrese de usar la misma "alineación de miembros de estructura" en todos los códigos y bibliotecas.

  • La mejor regla es definir /ZP para usar el valor "predeterminado". En Visual Studio, en Propiedades C/C ++ Generación de código

  • Msdn cite: "No debe usar esta opción a menos que tenga requisitos de alineación específicos." Mira aquí

  • Consejo: Use #PAGMA PACK Si necesita controlar la alineación en algunas estructurasMira alla

Ejemplo:

#pragma pack(1) // - 1 byte alignment 

    typedef union 
    {   
        u64 i;
        struct{             // CUSTOMS.s is used by Folders
            u32  uidx;      // Id, as registered 
            byte isoS, isoT;    // isoS/isoT combination.
            byte udd0, udd1;    // custom values (TBD)
        }s;
    }CUSTOMS;

    struct Header   // exactly 128 bits
    {       
        u32 version;        
        u32 stamp;          // creation time
        CUSTOMS customs;                // properties 
    }

#pragma pack()  // this pragma restores the **default** alignment

*

Espero que esta explicación ayude, porque esto no es en realidad un error en el código, sino un error de configuración grave: difícil de detectar porque se encuentra en opciones sutiles de compilador. Gracias por todo,

    *

Asigno dinámicamente la memoria correctamente.

Creo que el problema aquí es que desaconsejas la memoria de manera innovadora. Lo que quiero decir con esto es que es posible que esté tratando de usar la memoria liberada. Lo siento, no puedo evitar más, probablemente podría agregar el código real.

Tome mi trabajo en esto: asigno dinámicamente la memoria correctamente.

Pero ¿estás seguro de que tus búferes son del tamaño correcto y tu free() ellos correctamente? Doble liberaciones y desbordamientos del búfer pueden conducir fácilmente a la corrupción del montón que puede causar malloc() fallar en todo tipo de formas.

Si las estructuras de gestión utilizadas internamente por malloc() Damarse, generalmente no conducirá a un error de inmediato. Pero luego llama a malloc() o free() que tratar de usar estas estructuras dañadas fallarán cosas erráticas.

¿Estás usando malloc () en una matriz? Porque yo pensar El error podría ser que se olvide de asignar un Ubicación de memoria adicional al final - Lo que sucede es que trata de escribir en esa ubicación, que no se le asigna, y supone que está tratando de escribir en un lugar que ya ha sido liberado.

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