2010-09-21 9 views

risposta

37

Questo è chiamato il nuovo operatore di posizionamento. Consente di fornire la memoria in cui verranno allocati i dati senza che l'operatore new lo assegni. Ad esempio:

Foo * f = new Foo(); 

Quanto sopra assegnerà la memoria per voi.

void * fm = malloc(sizeof(Foo)); 
Foo *f = new (fm) Foo(); 

Quanto sopra utilizzare la memoria allocata dalla chiamata a malloc. new non assegnerà più. Non sei, tuttavia, limitato alle classi. Puoi utilizzare un nuovo operatore di posizionamento per qualsiasi tipo che assegnerai con una chiamata a new.

Un "getcha" per il posizionamento nuovo è che si non dovrebbe rilasciare la memoria allocata da una chiamata al nuovo operatore di posizionamento utilizzando la parola chiave delete. Distruggere l'oggetto chiamando direttamente il distruttore.

f->~Foo(); 
+2

Sì. Vedi anche [questa risposta] (http: // StackOverflow.it/questions/2697892/what-is-return-type-of-new-in-c/2697929 # 2697929) per la differenza tra una nuova espressione e l'allocazione di memoria effettiva. – sbi

+2

"' new' non assegnerà più. " - per l'oggetto come una cosa di dimensioni fisse - certo, ma ovviamente assegnerà la memoria dinamica se l'oggetto lo richiede - stringhe, framebuffer, database, qualunque cosa. –

2

Sono arrugginito su questo ma consente di scrivere l'oggetto su un blocco di memoria che è già stato assegnato. Ha anche bisogno di un'istruzione di cancellazione reciproca per cancellarla dalla memoria.

2

Se si utilizza un pool di memoria, è necessario utilizzare il costruttore sul posto per inizializzare l'oggetto mentre vengono assegnati dal pool.

1

È un modo per chiamare un costruttore senza allocare memoria. Il tuo y deve essere un puntatore ponendo abbastanza memoria per un nuovo oggetto Datatype. Inoltre, non chiamare delete, chiamare ~DataType().

7

La risposta breve è che il codice costruisce un oggetto nello spazio indicato da . La risposta lunga è coperta al meglio dallo C++ FAQ.

4

Questo è più comunemente noto come 'nuova collocazione' ed è discusso abbastanza bene da parte del C++ FAQ (nell'area 'distruttori'):

Esso permette costruisci oggetti nella memoria grezza, che può essere utile in alcune situazioni specializzate, come quando potresti voler allocare una matrice per un gran numero di oggetti possibili, ma vuoi costruirla quando necessario perché spesso potresti non aver bisogno di un ascoltare il massimo, o perché si desidera o è necessario utilizzare un allocatore di memoria personalizzato.

Problemi correlati