2016-01-28 11 views
5

Sto cercando di capire il codice di un'altra persona scritto in C++, ma c'è uno strano uso del costruttore che non ho mai visto. Il codice è simile al seguente:Strano uso del costruttore in C++

A* a = new A(some initial values...); 
... 
B* b = new (a) B(some initial values...); 

Quando l'inizializzazione variabile b c'è (a) tra new e B(...). Cosa significa questo?

+13

Google "placement new" – Bathsheba

+1

hairstpling: questo non è il codice dei costruttori, ma questo codice chiama il costruttore. – user463035818

+3

Ma sembra strano utilizzare il posizionamento nuovo su qualche altra istanza di classe - A. – marcinj

risposta

7

La riga di codice:

B* b = new (a) B(some initial values...); 

sta usando una "placement new".

Il comportamento predefinito; sta creando il nuovo oggetto di tipo B nella stessa posizione di memoria dell'oggetto a. Se ci sono sovraccarichi associati per il posizionamento nuovo, il comportamento sarebbe codificato nel sovraccarico, che potrebbe includere anche un comportamento di tipo predefinito.

Il codice deve essere considerata con eventuali sovraccarichi, layout della memoria degli oggetti e come le classi A e B riferiscono a vicenda.

È insolito creare un oggetto sulla posizione di un oggetto precedentemente creato. Immagino che ci sia del codice tra questi due qui presentato che decostruisce (ma lascia ancora la memoria "allocata") l'oggetto precedente a prima di costruire il nuovo al suo posto.

Il isocpp FAQ ha qualche ulteriore consiglio sull'uso di questa tecnica e dei suoi pericoli.

+1

allora cosa succede a 'a'? come condividono la stessa posizione? –

+2

@ Selman22. Dipende da quale altro codice ci sia. Francamente penso che il codice abbia un odore. – Niall

+3

Non lo sta necessariamente creando nella stessa posizione, potrebbe esserci un sovraccarico di 'operator new (size_t, A *)' che fa qualcosa di completamente diverso (es. Chiama 'return a-> allocate (sizeof (B))') –

2

Si chiama così posizionamento nuova sintassi.

Forse non te ne rendi conto ma nuovo si comporta principalmente come una funzione standard di C++ e quindi può essere ignorato e talvolta può anche accettare parametri aggiuntivi. In questo caso, il parametro aggiuntivo (argomento) passato alla funzione new della classe B è a.

Si può leggere di più su questo per esempio here

0

new expression

A meno che non sovraccarica (nel qual caso si potrebbe anche formattare il disco rigido), significa costruire B in posizione a, senza assegnazione di nuovi memoria fine a se stessa.

+1

Questo è ciò che il posizionatore di default-new fa, ma questo potrebbe usare un overload' operatore new (size_t, A *) 'che potrebbe restituire una posizione di memoria completamente diversa, piuttosto che la stessa posizione di 'a'. –

+0

@JonathanWakely debitamente notato e modificato, grazie. –