¿cuáles son las razones de la pérdida de memoria en C C++ (excepto la memoria asignación habitual y se olvide de cancelar la asignación es)razón para la desviación de memoria en C C++
Respuesta
Si se produce una excepción entre la asignación y desasignación, se producirá pérdida de memoria.
void f1() {
int* ptr = new int;
// do something which may throw an exception
// we never get here if an exception is thrown
delete ptr;
}
Cada vez f1 termina con una excepción, 4 bytes se filtraron (suponiendo int es 4 byte).
great point thanks watson – ashmish2
... una de las razones por las que los punteros inteligentes son "más inteligentes" que los punteros sin formato como 'int *' (que no tienen destructor): http://stackoverflow.com/questions/106508/what-is -a-smart-pointer-and-when-should-i-use-one – HostileFork
una pérdida de memoria se produce cuando se colocan en la memoria, no tiene aún lo desasignó, y , nunca podrá desasignarlo porque ya no puede acceder a él.
Por ejemplo, el código siguiente provoca una pérdida de memoria de tamaño sizeof(int)
:
int * a = malloc(sizeof(int)); //allocate memory
a = 0; //this will cause a memory leak
Esto crea una pérdida de memoria, porque ahora nunca seremos capaces de anular la planificación de la memoria asignada para a
.
A new
sin un delete
, un new[]
sin un delete[]
, un malloc
sin un free
.
En serio, ¿qué más quieres escuchar?
También puede perder memoria cuando no desasignar algún otro recurso como no llamar fclose en un FILE * o algún otro mango biblioteca porque pueden asignar buffers de memoria que no se tiene acceso directo a su programa.
No hay ninguna otra razón para la desviación de memoria además de la que usted menciona
Digamos que ha creado una clase que hereda alguna otra clase que no tenga un destructor virtual. Si el tipo del puntero a esta clase no es la clase más derivada (esto generalmente ocurre si usa una fábrica abstracta), entonces solo se llamará al destructor del tipo de puntero y cualquier cosa que haya estado esperando liberar en la mayoría de los derivados el destructor de clase tendrá fugas.
Este es un error muy común y que algunas veces es difícil de ver.
De todos modos, si se quiere evitar pérdidas de memoria con C++ sigue estas reglas:
- Prefiero pasar referencias en lugar de punteros
- Uso puntero inteligente siempre que sea posible (ver: shared_ptr)
por supuesto, el estándar dice que es un comportamiento indefinido si el destructor de la clase base no es virtual, entonces estás manipulando el mal y una pérdida de memoria es la menor de tu preocupación aquí. En cuanto a 'shared_ptr', a veces es útil, pero hay muchos mejores punteros/contenedores inteligentes para uso diario. Sin duda debería ser la última opción. –
Me sorprende que nadie haya mencionado la corrupción en la memoria todavía.
Recuerdo un caso cuando teníamos un asignador de memoria de bloques de tamaño fijo implementado como una lista vinculada.
Algunos tipos habían estropeado los cálculos de tamaño, lo que llevó a copiar datos solo un par de bytes más allá del tamaño máximo del bloque (los apuntadores tenían solo 2 bytes de longitud en el momento :)). A continuación, sobrescribía el enlace "siguiente" ubicado al comienzo del siguiente bloque libre con basura que se llenó con ceros.
Esto tuvo la consecuencia de cortar la cadena de bloques libres. Como en ese punto los otros componentes del software mantenían sus propios indicadores de los bloques que estaban usando, el programa parecía funcionar bien.
Pero, por supuesto, la lista se quedó corta de unas pocas cuadras de vez en cuando, y esta fuga eventualmente agotó los bloques libres, muriendo de hambre la aplicación.
El siguiente ejemplo, escrito en pseudocódigo, tiene como objetivo mostrar cómo se puede producir una pérdida de memoria y sus efectos, sin necesidad de ningún conocimiento de programación. El programa en este caso es parte de un software muy simple diseñado para controlar un ascensor. Esta parte del programa se ejecuta cada vez que alguien dentro del ascensor presiona el botón de un piso.
Cuando se pulsa un botón:
Get some memory, which will be used to remember the floor number
Put the floor number into the memory
Are we already on the target floor?
If so, we have nothing to do: finished
Otherwise:
Wait until the lift is idle
Go to the required floor
Release the memory we used to remember the floor number
La pérdida de memoria se produciría si el número del piso solicitada es la misma planta que el ascensor está encendido; la condición para liberar la memoria se omitirá. Cada vez que ocurre este caso, se filtra más memoria.
- 1. Profiler de memoria para C
- 2. asignación de memoria para const en C#
- 3. C++: Razón por la cual usar ".hh" como extensión para los archivos de encabezado de C++
- 4. ¿C# limpia la memoria asignada C++?
- 5. Asigne memoria estática en la memoria caché de la CPU en c/C++: ¿es posible?
- 6. ¿Hay alguna razón para usar propiedades privadas en C#?
- 7. ¿Alguna razón para usar byte/short, etc. en C#?
- 8. C++ Gestión de la memoria
- 9. Asignación de memoria en C++
- 10. Detectores de fugas de memoria para C?
- 11. Asignadores de memoria de subprocesos múltiples para C/C++
- 12. C++ memoria asignada dinámicamente
- 13. Fuga de memoria en C++
- 14. asignación de memoria en C++
- 15. Biblioteca de memoria compartida distribuida para C++?
- 16. Asignación de memoria en C
- 17. ¿Qué razón hay para que C# o Java tengan lambdas?
- 18. ¿Cómo evitar quedarse sin memoria en la aplicación de uso de memoria alta? C/C++
- 19. C++ herramienta para visualizar la alineación de la memoria?
- 20. C - crear archivo en la memoria
- 21. Transmisión en C++ a la memoria
- 22. C++: Asignadores de memoria
- 23. -LEER artículos para C++ gerencia de memoria
- 24. ¿Hay alguna razón para llamar a eliminar en C++ cuando un programa sale de todos modos?
- 25. C Administración de memoria
- 26. C# Image.Clone Excepción de memoria
- 27. asignando memoria "no administrada" en C#
- 28. Formas de evitar fugas de memoria en C/C++
- 29. Disposición de la memoria C struct?
- 30. C++ gestión de la memoria y vectores
¿Demasiadas cervezas la noche anterior? –