c++ c memory memory-management

c++ - ¿Qué es un "stomop de memoria"?



memory memory-management (3)

Acabo de encontrar esta publicación de blog que menciona "memoria pisada fuerte":

un programa C ++ que es fácilmente capaz de pisotear la memoria (algo de lo que probablemente nunca hayas oído si naciste en un mundo de código administrado).

¡Y de hecho nunca he oído hablar de eso!

Entonces, ¿qué es esto, un pistoletazo de memoria, pisoteando la memoria? ¿Cuándo ocurre?


La memoria es "pisoteada" cuando una parte del código manipula la memoria sin darse cuenta de que otra parte del código está usando esa memoria de una manera que entra en conflicto. Hay muchas maneras comunes en que la memoria puede ser pisoteada.

Uno está asignando, digamos, 100 bytes de memoria pero luego almacena algo más allá de la dirección número 100. Esta memoria puede usarse para contener algo completamente diferente. Esto es particularmente difícil de depurar porque el problema aparecerá cuando algo intente acceder a la víctima que fue pisoteada, y el código que lo pisoteó puede no estar relacionado.

Otra es acceder a la memoria después de que fue liberada. La memoria puede asignarse para otro objeto. Una vez más, el código que muestra el problema puede estar relacionado con el objeto recientemente asignado que obtuvo la misma dirección y sin relación con el código que causó el problema.


Muy a menudo es un desbordamiento del búfer; como ejemplo, este código:

char buffer[8]; buffer[8] = ''a'';

"pisará" lo que sea que esté en el siguiente punto de la memoria después del buffer . En términos generales, ''pisar fuerte'' es cuando la memoria se escribe involuntariamente.


Otras respuestas básicamente son correctas, pero me gustaría dar un ejemplo.

int a[10], i; for (i = 0; i < 11 ; i++) a[i] = 0;

int i, a[10]; for (i = 0; i < 11 ; i++) a[i] = 0;

Estas muestras pueden conducir a un ciclo infinito (o pueden no conducir), porque es un comportamiento indefinido.

Muy probablemente la variable i en la memoria se almacena justo después de la matriz. Así que acceder a[10] podría acceder a i en otras palabras, podría reiniciar el contador de bucles.

Creo que es un buen ejemplo que demuestra la memoria "pisando fuerte".