Pregunta

Tengo algo de código en MS VC ++ 6.0 que estoy depuración. Por alguna razón, en este determinado punto en el que estoy tratando de eliminar parte de la memoria asignada dinámicamente, se rompe y me sale un cuadro de mensaje emergente diciendo "Breakpoint usuario llama desde el código en bla, bla" .. entonces la ventana de desmontaje aparece y me consulte

*memory address* int      3

Lo curioso es, no hay ningún lugar en el código que estoy llamando una instrucción de montaje como este (creo asm int 3 es un comando break hardware para x86?) ..

lo que podría estar causando esto?

EDIT: RESPUESTA: Mi código fue "caminando fuera de la final" de una matriz, pero sólo en los lugares marcados por el estudio de depuración visual con 0xFDFDFDFD, que se llama una valla NoMan'sLand .. Creo que es también llamado Off -por-uno error .. Esta matriz no estaba relacionada con el punto en que estaba liberando la memoria cuando el error fue ocurriendo. Lo que hacía más difícil de detectar ..: (

¿Fue útil?

Solución

Probablemente se esté golpeando código en las rutinas montón de depuración que han encontrado daños en el montón.

¿Cómo es la pila de llamadas como cuando has llegado a la Int 3?

Edit: Con base en el seguimiento de pila en sus comentarios, la rutina _CrtIsValidHeapPointer() está diciendo que el puntero de ser liberado es malo. Aquí está el fragmento de código de fuente DBGHEAP.C de MSVC:

    /*
     * If this ASSERT fails, a bad pointer has been passed in. It may be
     * totally bogus, or it may have been allocated from another heap.
     * The pointer MUST come from the 'local' heap.
     */
    _ASSERTE(_CrtIsValidHeapPointer(pUserData));

pUserData sería el valor del puntero que estés deleteing.

Otros consejos

  

(creo asm int 3 es una ruptura de hardware   comando para x86?

Es. Se llama "punto de interrupción de hardware" . Si está utilizando el depurador de VS con el código fuente del proyecto, que es como un punto de interrupción (pero en el código). Desde VS2005, si su aplicación se inicia sin ningún depurador, la aplicación simplemente chocar, como si se lanzó una excepción sin gestionar.

En muchos de la compañía, no es una macro simple que se usa para agregar que el punto de interrupción en el código. Afirma que puede reemplazar y excepciones en algunos casos (duras y poco frecuente):

#define BREAKPOINT __asm { int 3; }

BREAKPOINT;

Ver:

Así que sugiero en busca de algún objeto o Macro hacer esto, o tal vez appen en un módulo (DLL / lib) que usted no tiene el código de?

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