Limpando no método Shutdown () em vez de destruidor

NoTutoriais do Rastertek DirectX eles têm construtores e destruidores vazios e usaminitialize() eshutdown() funções para inicialização e limpeza de objetos. Depois de usar esse design por um tempo, posso entender um pouco os benefícios de ter uminitialize() método, mas não consigo ver como usar umshutdown() O método é melhor do que colocar todo o código de limpeza no destruidor.

O motivo pelo qual eles fornecem é o seguinte:

Você também notará que eu não limpo nenhum objeto no destruidor de classes. Em vez disso, eu limpo todo o meu objeto na função Shutdown que você verá mais abaixo. A razão é que não confio que seja chamado. Certas funções do Windows, como ExitThread (), são conhecidas por não chamarem seus destruidores de classe, resultando em vazamento de memória. É claro que você pode chamar versões mais seguras dessas funções agora, mas apenas tomo cuidado ao programar no Windows.

Portanto, o padrão de uso geral fica assim:

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;

Ao olhar para o código de Rastertek, parece-me que eles vêm do fundo C (inicializando todas as variáveis na parte superior da função, usando apenas ponteiros e matrizes brutos, etc.), então eu me pergunto se isso é outra coisa que é desnecessário no C ++ moderno (para um, torna mais difícil o uso de ponteiros inteligentes). Existe algum benefício real para esse design?

questionAnswers(1)

yourAnswerToTheQuestion