Probabilmente è più facile capire se si immagina di costruire diversi oggetti MyClass entro un blocco di memoria.
In tal caso, sarebbe andare qualcosa come:
- allocare un blocco gigante di memoria utilizzando new char [10 * sizeof (MyClass)] o malloc (10 * sizeof (MyClass))
- Usa il nuovo posizionamento per costruire dieci oggetti MyClass all'interno di quella memoria.
- Fai qualcosa.
- Chiama il distruttore di ciascuno dei tuoi oggetti
- Deallocate il grande blocco di memoria usando delete [] o free().
Questo è il genere di cosa che si potrebbe fare se sei scrivere un compilatore, o di un sistema operativo, ecc
In questo caso, spero che sia chiaro perché è necessario "distruttore" separata e "cancella" i passaggi, perché non c'è motivo per cui lo verrà cancellato dalla chiamata.Tuttavia, è deallocare la memoria, ma normalmente lo farai (libero, cancella, non fare nulla per un array statico gigante, esci normalmente se l'array fa parte di un altro oggetto, ecc. Ecc.) E se non lo fai sarà trapelato.
Inoltre, come ha detto Greg, in questo caso, non è possibile utilizzare Elimina perché è stato assegnato all'array nuovo [], quindi è necessario utilizzare delete [].
Si noti inoltre che è necessario presumere di non aver eliminato l'eliminazione per MyClass, altrimenti farà qualcosa di completamente diverso che è quasi certamente incompatibile con "nuovo".
Quindi penso che non vogliate chiamare "cancellare" come descrivete, ma potrebbe mai funzionare? Penso che questa sia fondamentalmente la stessa domanda di "Ho due tipi non correlati che non hanno distruttori. Posso aggiungere un puntatore a un tipo, quindi cancellare quella memoria attraverso un puntatore a un altro tipo?" In altre parole, "il mio compilatore ha una grande lista di tutte le cose allocate, o può fare cose diverse per tipi diversi".
Ho paura di non esserne sicuro. Leggendo le specifiche dice:
5.3.5 ... Se il tipo statico del operando [dell'operatore delete] è diverso dal suo tipo dinamico, tipo statico deve essere una classe base dell'operando del il tipo dinamico e il tipo statico devono avere un distruttore virtuale o il comportamento non è definito.
Penso che significhi "Se si usano due tipi non correlati, non funziona (è corretto cancellare un oggetto di classe in modo polimorfico attraverso un distruttore virtuale)."
Quindi no, non farlo. Ho il sospetto che possa spesso funzionare in pratica, se il compilatore cerca esclusivamente l'indirizzo e non il tipo (e nessuno dei due tipi è una classe a ereditarietà multipla, che mancherebbe l'indirizzo), ma non provarlo.
+1 Bella domanda, mi piacerebbe anche capirlo. – AraK
Bene, tecnicamente, il posizionamento 'new' non alloca memoria. Ma è un dettaglio in questo contesto. – Griwes
@Griwes: +1 Probabilmente è un punto fondamentale :) –