Al contrario, dovresti sempre preferire le allocazioni dello stack, nella misura in cui, come regola generale, non dovresti mai avere new / delete nel tuo codice utente.
Come dici tu, quando la variabile viene dichiarata nello stack, il suo distruttore viene chiamato automaticamente quando esce dall'ambito, che è il tuo strumento principale per tenere traccia della durata della risorsa ed evitare perdite.
Quindi, in generale, ogni volta che è necessario allocare una risorsa, sia che si tratti di memoria (chiamando new), handle di file, socket o qualsiasi altra cosa, racchiuderla in una classe in cui il costruttore acquisisce la risorsa e il distruttore la rilascia. Quindi puoi creare un oggetto di quel tipo nello stack e hai la garanzia che la tua risorsa venga liberata quando esce dall'ambito. In questo modo non devi tenere traccia delle tue nuove coppie / eliminare ovunque per assicurarti di evitare perdite di memoria.
Il nome più comune per questo idioma è RAII
Esamina anche le classi di puntatori intelligenti che vengono utilizzate per avvolgere i puntatori risultanti nei rari casi in cui devi allocare qualcosa con nuovo al di fuori di un oggetto RAII dedicato. Si passa invece il puntatore a un puntatore intelligente, che quindi tiene traccia della sua durata, ad esempio mediante il conteggio dei riferimenti, e chiama il distruttore quando l'ultimo riferimento esce dall'ambito. La libreria standard ha std::unique_ptr
una semplice gestione basata sull'ambito e std::shared_ptr
fa riferimento al conteggio per implementare la proprietà condivisa.
Molti tutorial dimostrano la creazione di istanze di oggetti utilizzando uno snippet come ...
Quindi quello che hai scoperto è che la maggior parte dei tutorial fa schifo. ;) La maggior parte dei tutorial ti insegna le pessime pratiche C ++, incluso chiamare new / delete per creare variabili quando non è necessario e darti difficoltà a tenere traccia della durata delle tue allocazioni.