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?