2010-11-10 7 views
11

¿Cómo comprobar si la memoria a la que apunta el puntero se ha desasignado con éxito?Cómo comprobar la desasignación de memoria

+0

Más detalles necesarios: ¿cómo se asignó inicialmente la memoria? y * ¿por qué * necesita verificar si ha sido desasignado? –

+0

En la capa de aplicación, no puede. Sin embargo, si está trabajando en algunas capas de kernel de muy bajo nivel, podría haber formas de hacerlo. – Chubsdad

+1

Yeap, ¿cuál es el verdadero problema que está tratando de resolver? – sharptooth

Respuesta

12

En pocas palabras: no se puede.

Echa un vistazo a herramientas como Valgrind para ayudarlo a solucionar problemas de pérdida de memoria.

Algunas otras cosas que usted debe considerar:

  • utilizar punteros inteligentes para que usted no tiene pienses en la gestión de memoria,
  • Establecer sus punteros a 0 después de que los libres, de modo que un mayor delete no tiene ningún efecto,
  • use clases estándar (vector, ...) en lugar de rodar su propia,
  • Por último, no utilice punteros (en realidad casi se puede)
+0

¿Cómo ayuda la configuración de los indicadores a 0 ayudar con este problema? –

+0

Para evitar problemas dobles gratis. Podría ser lo que OP quiere después de todo. –

+0

Es una pena establecer los punteros a 0 es un UB. –

5

Lo sentimos respuesta, muy corto "No se puede"

1
  1. Algunas herramientas que realizan análisis de código estático pueden señalar algunos problemas relacionados con la desasignación de memoria.
  2. Uso valgrind para comprobar si tiene pérdidas de memoria
  3. Evitar punteros primas - utilizar punteros inteligentes en lugar
2

Definir correctamente! Definir desasignado!

Después de desasignar la memoria (ya sea que esté libre o eliminada) no debe usar ese puntero nuevamente. Todas las otras suposiciones son irrelevantes.

Después de todo, se llama a la/C++ en tiempo de ejecución C para cancelar la asignación de memoria, pero el/C++ en tiempo de ejecución C también llamadas funciones del sistema operativo para liberar a la página. Incluso podría tener un asignador de memoria personalizado en la parte superior del tiempo de ejecución de C/C++ que, p. usa el almacenamiento en caché para implementar un algoritmo de asignación de memoria más rápido.

Todas estas capas pueden mantener la memoria desasignada por sí mismas (debido a la fragmentación o simplemente porque les gusta guardarla para sí mismas) o pueden indicarle a la capa subyacente que la desasigne. Puede suceder cualquier cosa, simplemente no use ese puntero nunca más.

0

En C++, puede asumir con seguridad que la desasignación nunca falla. Los destructores no deben arrojar excepciones, y la memoria real reservada nunca debe dejar de publicarse, por lo tanto, dados esos dos puntos, nada puede salir mal.

Sin embargo, si elimina un puntero que ya ha sido eliminado, su programa probablemente falle. Sin embargo, esto no es un problema con la desasignación: el delete original funcionó correctamente. Es un problema con la gestión de la memoria del programa si se intenta eliminar un puntero dos veces, pero eso es raramente necesaria con STL modernos y punteros inteligentes como std::vector, std::unique_ptr, etc ...

0

El manejo de excepciones. Es decir. probar/atrapar bloques.

+5

Incorrecto; un destructor no debe lanzar una excepción, entonces esto no hará nada. –

+0

buen punto. Gracias. –

Cuestiones relacionadas