usuario3699827
Tengo problemas con este código. Se rompe en la función libre (q->izv) y aparece un error de depuración que dice:
CRT detected that the application wrote to memory after end of heap buffer
No tengo idea de lo que eso significa, así que estaría agradecido por cualquier ayuda que reciba.
typedef struct izvodjaci{
char *izv;
int broj;
struct izvodjaci *sled;
}IZV;
obrisi_i(IZV *p){
while (p){
IZV *q;
q = p;
p = p->sled;
if (!strcmp(q->izv,"UNKNOWN")) free(q->izv);
free(q);
}
}
Gracias por adelantado
eric lippert
¿Qué significa “CRT detectó que la aplicación escribió en la memoria después del final del búfer del montón”?
Supongamos que asigna un búfer de almacenamiento dinámico:
char* buffer = malloc(5);
OK, buffer
ahora apunta a cinco caracteres en el montón.
Suponga que escribe seis caracteres en ese búfer:
buffer[0] = 'a';
buffer[1] = 'b';
buffer[2] = 'c';
buffer[3] = 'd';
buffer[4] = 'e';
buffer[5] = '\0';
Ahora has corrompido el montón; solo se te permitió escribir cinco caracteres y escribiste seis.
El programa ahora puede hacer cualquier cosa. Puede funcionar normalmente, puede fallar, puede enviar todas sus contraseñas a piratas informáticos en China, cualquier cosa.
Aparentemente, su implementación elige la mejor opción posible, que es “informarle que cometió un error”. Usted debería ser muy muy feliz que esto es lo que sucedió, en lugar de cualquiera de las horribles alternativas. lamentablemente te informa cuando se libera el búfery no cuando cometiste el errorpero alégrate de que hayas recibido un error.
-
Gracias. Usted tenía razón. Calculé mal y usé un espacio más del que asigné.
– usuario3699827
5 de junio de 2014 a las 9:56
-
Reescribí casi todo excepto eso… Esta es la primera vez que cometo ese error, así que no había visto ese mensaje de error antes, así que entré en pánico. Y gracias por los consejos.
– usuario3699827
5 de junio de 2014 a las 10:05
-
Hola Eric, esto fue increíble. Usé un poco strlen mientras copiaba de src char* a dest char*. ¿Puede decirme por qué el compilador de Visual Studio encuentra este problema de corrupción durante la versión gratuita, en lugar de cuando terminé escribiendo fuera de los límites de la memoria?
– saurabheights
22/04/2015 a las 19:31
-
@user1874627: este es un sitio de preguntas y respuestas para preguntas específicas sobre el código real, y lo que tiene allí es una pregunta específica sobre el código real, por lo que lo animo a (1) buscar para ver si ya está respondido , y si no (2) publique una pregunta!
–Eric Lippert
22/04/2015 a las 20:40
-
@user1874627: si tiene problemas para comenzar, aquí hay un problema más fácil. Suponga que estaba generando código para la detección de escrituras fuera de los límites en un desplazamiento arbitrario en un búfer de memoria, pero sabes que el desplazamiento es desde el inicio del búfer. ¿Cómo escribiría la detección de escritura fuera de los límites en ese caso? Ambos problemas tienen solución, pero este es mucho más fácil.
–Eric Lippert
22 de abril de 2015 a las 20:48
Lo más probable es que este sea solo el lugar donde se detecta el desbordamiento del búfer y no donde realmente ocurre. Intente reducir todo el código a una pequeña muestra que replique el problema y publíquelo aquí, suponiendo que no encuentre el problema primero.
– uesp
4 de junio de 2014 a las 14:14