Sì, questo è possibile. std::vector
fa questo, in quanto assegna i buffer con lo spazio per gli oggetti, quindi li costruisce condizionalmente (sul posto) e li distrugge, gestendo la memoria indipendentemente dalla durata dell'oggetto.
In C++ 11, utilizzerei un union
del tipo e un tipo piccolo con costruttori/distruttori banali per indicare un percorso di memoria che può adattarsi al tipo, ma non deve avere quel tipo in esso . Esterno a quello che devi tracciare se l'oggetto è effettivamente lì. La creazione dell'articolo consiste nell'utilizzare il posizionamento new
e distruggerlo consiste nel chiamare manualmente il distruttore.
Il buffer degli oggetti union
, sia N oggetti o 1, sarebbe gestito in modo completamente indipendente. Il costruttore predefinito di union
non costruisce nulla, o costruisce il tipo banale (nel qual caso potresti voler distruggere quel tipo banale).
Tuttavia, le probabilità sono che la vera risposta alla tua domanda è "non farlo". E se lo fai, avvolgi i puntatori in un class
il cui lavoro solo sta gestendo il pasticcio di cui sopra.Classi di quel tipo (il cui compito è gestire la durata del puntatore e le proprietà del puntatore) sono chiamate "puntatori intelligenti".
Quindi la domanda è come rendere l'oggetto ad allocazione dinamica da deallocare in un modo in cui non è necessario chiamare esplicitamente 'delete' /' free'? – LihO
@LihO Sì. In alternativa, chiama 'delete' /' free' senza chiamare il distruttore. –
Bene, basta impostare quei puntatori interni a 'nullptr', quindi 'cancellarli sarà un no-op. –