Si chiama placement new. Chiama il costruttore sulla memoria specificata anziché allocare nuova memoria. Nota che in questo caso devi chiamare esplicitamente il distruttore del tuo oggetto prima di liberare la memoria allocata.
Chiarimento. Supponiamo di aver assegnato memoria grezza
char * rawMemory = new char [sizeof (Object)];
e si desidera costruire un oggetto su quella memoria. Si chiama
new(rawMemory) Object(params);
Ora, prima di liberare la memoria
delete [] rawMemory;
si dovrà chiamare il derstuctor dell'oggetto esplicitamente
reinterpret_cast<Object*>(rawMemory)->~Object();
Nel vostro esempio particolare, tuttavia, il problema potenziale è che non hai distrutto correttamente l'oggetto esistente prima di costruirne uno nuovo nella sua memoria.
Bonus: mai chiesti come standard di std::vector
può fare a meno dei suoi oggetti contenuti essendo default-costruibile? Il motivo è che sulla maggior parte, se non tutte, le implementazioni allocator<T>
non memorizzano un T* p
che richiederebbe che T sia costruttivamente predefinito in caso di p = new T[N]
. Invece memorizza un puntatore char
- memoria raw e alloca p = new char[N*sizeof(T)]
. Quando un oggetto è push_back
, chiama semplicemente il costruttore di copie con il posizionamento nuovo sull'indirizzo appropriato in tale matrice di caratteri.
fonte
2012-11-29 13:15:10
A parte le risposte esistenti: la sintassi nel * titolo * della tua domanda non esiste! Non è possibile utilizzare questa sintassi con qualsiasi valore, è sufficiente utilizzarlo in una chiamata del costruttore, ad esempio "valore" deve essere nella forma "T (argomenti)". –
posizionamento nuovo sempre utilizzato in un pool di memoria C++ (pool di oggetti). come risposta aggiuntiva. – Healer