C++ : new, delete, excepciones, std::terminate y RAII. Asegurando liberación de recursos
Channel: Profesor Retroman
Date: 30/11/2019

[C++ 2.4]: Serie completa http://bit.ly/CppGameDev19
Serie anterior C++: http://bit.ly/CppDev2016-19
Librería TinyPTC UA: http://bit.ly/tinyPTC-UA19

Trabajamos las diferencias entre reservar memoria a mano y hacerlo de forma gestionada a través de constructores y destructores de una clase. Entendemos las garantías que ofrecen los destructores en C++, cómo son llamados siempre que se produce el rebobinado de la pila ante una excepción, y cómo eso puede suceder o no ante excepciones no controladas en una llamada a std::terminate. Con esto entendemos las ventajas y necesidades del patrón RAII (Resource Acquisition Is Initialization). Usamos también valgrind, entendemos detalles de los constructores, gestionamos excepciones de manera básica y comprendemos la importancia de los memory leaks.

Contenidos detallados:
- Reservando memoria en el #heap a mano con #new y #delete.
- Usando valgrind para verificar el uso apropiado de la memoria reservada en el heap.
- Entendiendo las #excepciones como forma de separar el código principal del código destinado a la gestión de errores.
- Analizando lo que sucede cuando se lanza una excepción (simulándolo con throw).
- Memory leaks producidos por una excepción al alterar el flujo normal de la ejecución del programa.
- Uso de los destructores como liberación garantizada de recursos
- Creando una clase usando el patrón RAII para que se encargue de reservar la memoria en el constructor y liberarla en el destructor, garantizando su liberación incluso en casos de excepciones.
- Pregunta : Diferencia entre usar constructores delegados en un constructor e inicializar atributos usando =. Diferencias entre constructor y operador asignación.
- Problema : las excepciones no controladas llaman a std::terminate. La implementación de std::terminate puede o no rebobinar la pila (stack unwinding). Si no lo hace, no se llama a los destructores
- Entendiendo los problemas que pueden haber de depender de alguna característica que puede variar entre implementaciones (como el stack unwinding dependiente de std::terminate)
- Capturando excepciones y entendiendo cómo funcionan.
- Observando cómo funciona todo al capturar excepciones. La captura de excepciones garantiza el rebobinado de la pila porque se produce una salida progresiva ordenada de los ámbitos hasta encontrar el catch.
- Qué sucede con la memoria no liberada por un proceso y por qué es importante.

Clase de Videojuegos 1 2019/20
Grado en Ingeniería Multimedia
Universidad de Alicante