Una pérdida de memoria es un tipo de error de programación que se produce cuando un programa asigna más memoria de la que libera . De este modo , una aplicación puede quedarse sin memoria y hacer que el sistema se bloquee . Para evitar pérdidas de memoria , lo que necesita saber cuando se presentan con mayor frecuencia y ser consciente con el uso de la "nueva " y los operadores " delete " C + +. Cosas que necesitará
Proficiency in C + +
C + + compilador
depurador y otras herramientas de software de investigación
Ver Más instrucciones
1
entender los conceptos básicos de operador . El C + + operador "new " memoria heap asigna . El operador "delete " libera memoria heap. Por cada "nuevo ", se debe utilizar un "delete " para que se libera la misma memoria que asignan : .
Char * str = new char [ 30 ] ; //Asignar 30 bytes para albergar una cadena < br > delete [ ] str //Borrar los 30 bytes y hacer str no apuntan a nada
2
Reasignar memoria sólo si se ha borrado . . En el código de abajo , str adquiere una nueva dirección con la segunda asignación . La primera dirección se pierde irremediablemente , al igual que los 30 bytes que apuntaban a . Ahora son imposibles a la libre , y usted tiene una pérdida de memoria : .
Char * str = new char [ 30 ] ; //Dale str una dirección de memoria
//delete [ ] str ; //Quitar el primer comentario que marca en esta línea para corregir
str = new char [ 60 ], . . //Dale str otra dirección de memoria con el primero ha ido para siempre
delete [ ] str ; //se elimina el 60 bytes , no solo los primeros 30 .
3
Ver las asignaciones de puntero. Cada variable dinámica ( la memoria asignada en el montón ) necesita ser asociado con un puntero . Cuando una variable dinámica se convierte en disociado de su puntero ( s ) , se hace imposible de borrar . Una vez más, esto se traduce en una pérdida de memoria :
char * cadena1 = new char [ 30 ] ;
char * cadena2 = new char [ 40 ] ;
strcpy ( cadena1 , " pérdida de memoria ") ;
str2 = cadena1 //Bad! Ahora, los 40 bytes son imposibles de libre
delete [ ] str2 , . //Esto elimina los 30 bytes
delete [ ] cadena1 , . //Posible violación de acceso . ¡Qué desastre !
4
Tenga cuidado con los punteros locales. Un puntero se declara en una función se le asigna en la pila, pero la variable dinámica que apunta se asigna en el montón. Si no se elimina, se va a persistir después el programa sale de la función: void
Leak (int x ) {
char * p = new char [ x ] ;
//delete [ ] p , . //Eliminar el primer comentario que marca para corregir
}
5
Preste atención a los corchetes después de " eliminar ". Utilice "delete " por sí mismo para liberar a un único objeto. Utilice "delete " [] con corchetes para liberar a un array montón. No hacer algo como esto :
char * uno = new char ;
delete [ ] se //Wrong
char * Cuántas = new char [ 30 ] ;
eliminar muchos ; //¡ Wrong