Ao contrário, você deve sempre preferir alocações de pilha, na medida em que, como regra geral, você nunca deve ter new / delete em seu código de usuário.
Como você disse, quando a variável é declarada na pilha, seu destruidor é automaticamente chamado quando sai do escopo, que é sua principal ferramenta para rastrear o tempo de vida do recurso e evitar vazamentos.
Portanto, em geral, toda vez que você precisa alocar um recurso, seja memória (chamando new), identificadores de arquivo, soquetes ou qualquer outra coisa, envolva-o em uma classe onde o construtor adquire o recurso e o destruidor o libera. Em seguida, você pode criar um objeto desse tipo na pilha e tem a garantia de que seu recurso será liberado quando sair do escopo. Dessa forma, você não precisa rastrear seus pares novos / deletar em todos os lugares para evitar vazamentos de memória.
O nome mais comum para este idioma é RAII
Observe também as classes de ponteiros inteligentes que são usadas para envolver os ponteiros resultantes nos raros casos em que você precisa alocar algo com novo fora de um objeto RAII dedicado. Em vez disso, você passa o ponteiro para um ponteiro inteligente, que então rastreia seu tempo de vida, por exemplo, por contagem de referência, e chama o destruidor quando a última referência sai do escopo. A biblioteca padrão tem std::unique_ptr
um gerenciamento simples baseado em escopo e std::shared_ptr
que faz a contagem de referência para implementar a propriedade compartilhada.
Muitos tutoriais demonstram a instanciação de objetos usando um snippet como ...
Então o que você descobriu é que a maioria dos tutoriais é uma merda. ;) A maioria dos tutoriais ensina práticas ruins de C ++, incluindo chamar new / delete para criar variáveis quando não for necessário, e dificultando o controle do tempo de vida de suas alocações.