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 esta manera, 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 producen más frecuentemente y ser consciente con el uso de los "nuevos" y "eliminar" los operadores de C ++.
Instrucciones
1 Entender los conceptos básicos de operador. El operador de C ++ "nueva" asigna memoria del montón. El operador "borrado" libera memoria del montón. Por cada "nuevo", se debe utilizar una función de "Borrar" para que libere la misma memoria se asignan:
char * str = new char [30]; // Asignar 30 bytes para alojar una cadena.
delete [] str; // Borrar esos 30 bytes y hacer punto str ninguna parte.
2 Reasignar la memoria sólo si se ha borrado. En el código siguiente, str adquiere una nueva dirección con la segunda asignación. La primera dirección se pierde irremediablemente, y también lo son los 30 bytes que apuntaba a. Ahora están imposible libre, y usted tiene una pérdida de memoria:
char * str = new char [30]; // Dar str una dirección de memoria.
// Delete [] str; // Eliminar el primero que marca en esta línea para corregir comentario.
str = new char [60]; // Dar str otra dirección de memoria con la primera de ellas ha ido para siempre.
delete [] str; // Esto elimina los 60 bytes, no sólo los primeros 30.
3 Ver las asignaciones de puntero. Cada variable dinámica (memoria asignada en el montón) necesita ser asociado con un puntero. Cuando una variable dinámica queda disociada de su puntero (s), se hace imposible de borrar. Una vez más, esto se traduce en una pérdida de memoria:
Char
str1 = new char [30];
Char str2 = new char [40];
strcpy (cadena1, "pérdida de memoria");
str2 = str1; // ¡Malo! Ahora los 40 bytes son imposibles de liberar.
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 asigna en la pila, pero la variable dinámica que apunta se asigna en el montón. Si no se elimina, se persistirá después de salir del programa de la función:
anular la fuga (int x) {
char * p = new char [x];
// Delete [] p; // Eliminar la primera marcado para corregir comentario.
}
5 Prestar atención a los corchetes después de "eliminar". Use "eliminar" por sí mismo para liberar a un solo objeto. Use "eliminar" [] con corchetes para liberar una matriz montón. No hacer algo como esto:
carbonizar una nueva = Char;
delete [] uno; // Incorrecto
charlas muchos = new char [30];
eliminar muchos; // ¡Incorrecto!
Consejos y advertencias
- Evitar la mezcla de C y C ++. Use nuevo y borrar o utilizar malloc () y free (). Bajo ninguna circunstancia se utilizan con conexión nueva () o malloc () con delete.