Limpieza en el método de apagado () en lugar de destructor

EnTutoriales Rastertek DirectX Tienen constructores y destructores vacíos y en su lugar usaninitialize() yshutdown() Funciones para inicialización y limpieza de objetos. Después de usar este diseño por un tiempo puedo entender un poco los beneficios de tener uninitialize() método, pero no puedo ver cómo usar unshutdown() El método es mejor que poner todo el código de limpieza en el destructor.

La razón por la que proporcionan es la siguiente:

También notará que no hago ninguna limpieza de objetos en la clase destructor. En su lugar, hago todos mis objetos de limpieza en la función de apagado que verá más abajo. La razón es que no confío en que se llame. Ciertas funciones de Windows como ExitThread () son conocidas por no llamar a los destructores de su clase, lo que produce pérdidas de memoria. Por supuesto, ahora puede llamar a versiones más seguras de estas funciones, pero solo estoy teniendo cuidado al programar en Windows.

Así que el patrón de uso general se ve así:

class Renderer
{
public:
    Renderer() { }
    ~Renderer() { }

    bool initialize(...) { /* perform initialization */ }
    void shutdown() { /* clean-up */ }
}; 

Renderer* renderer = new Renderer;
renderer->initialize(...);

// use the renderer

renderer->shutdown();
delete renderer;
renderer = NULL;

Al mirar el código de Rastertek, me parece que vienen del fondo C (inicializando todas las variables en la parte superior de la función, usando solo punteros y matrices en bruto, etc.), así que me pregunto si esto es otra cosa más. innecesario en C ++ moderno (por un lado, hace que sea más difícil usar punteros inteligentes). ¿Hay algún beneficio real para este diseño?

Respuestas a la pregunta(1)

Su respuesta a la pregunta