¿Cuáles son algunas de las razones generales de la pérdida de memoria y la falla de segmentación?

StackOverflow https://stackoverflow.com/questions/1610407

  •  05-07-2019
  •  | 
  •  

Pregunta

¿Cuáles son algunas de las razones generales de los errores de pérdida de memoria y falla de segmentación?

¿Fue útil?

Solución

Segfaults:

  • uso de punteros colgantes: no se restablecen los punteros después de la desasignación
  • no está marcando un puntero antes de usar
  • no inicializando variables / miembros

Fugas de memoria / recursos:

  • olvidando liberar el recurso (memoria libre, cerrar archivo, ...)
  • en entornos con recolector de basura: creando un anillo de objetos de referencia

Cómo detectar / evitar:

  • punteros colgantes: regla de codificación, restablecer estrictamente los punteros después de la desasignación
  • use un verificador de código estático para evitar la mayoría de los segfaults
  • use un analizador de código dinámico para verificar que las fugas de recursos estén ausentes

Otros consejos

Fugas de memoria : en general, se refiere a un idioma como C, donde se administra la memoria manualmente. En este caso, estaría asignando memoria sin liberarla cuando haya terminado de usarla. Las asignaciones siguen acumulándose mientras la aplicación se está ejecutando y la memoria no se puede liberar hasta que el proceso termine de ejecutarse. Fugas de memoria (Wikipedia)

Fallos de segmentación : la causa más común de este tipo de error es intentar acceder a una parte de la memoria que no existe o está fuera de la memoria permitida de su programa en ejecución (por ejemplo, Si intentaste acceder a la memoria, el SO está cargado. Por lo general, esto significa que está intentando usar un puntero incorrecto, por ejemplo:

int* ptr;
...
...
...
*ptr = 5;

causaría un fallo de seguridad porque ptr es un puntero nulo (o basura) y no ha asignado memoria para que el puntero apunte. Error de segmentación (Wikipedia)

Lotes, incluyendo:

  • asignación de un trozo de memoria y luego usar más de lo asignado,
  • asignar memoria y no liberarla,
  • no inicializa los punteros de datos correctamente,
  • no está inicializando los punteros de función correctamente,
  • funciones de llamada con números o valores de parámetros incorrectos,
  • intentando leer o escribir a través de punteros NULL,
  • vinculación incorrecta a bibliotecas o bibliotecas incorrectas.

No todos estos se aplican a todos los idiomas, pero estas son algunas cosas útiles para comenzar a pensar.

Vea la serie Effective C ++ en Addison Wesley, muy bueno para el problema exacto. Tenga en cuenta que en el uso del puntero, uno tiene que eliminar individualmente todos los elementos y luego del puntero: requiere habilidad y, a menudo, es incorrecto, lo que lleva a errores ocultos que no se muestran fácilmente. Los otros carteles tienen las respuestas, solo estoy agregando un detalle adicional.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top