6

Oggi, ho scoperto che è possibile scrivere tale codice in C++ e compilarlo:Cosa fa questa allocazione dinamica?

int* ptr = new int(5, 6); 

Qual è lo scopo di tutto questo? So certamente la cosa dinamica new int(5), ma qui sono perso. Qualche indizio?

+4

Per quello che vale, il modo corretto per farlo in questo caso è 'int * ptr = new int ((5, 6));'. 'int (5,6)' dovrebbe causare un errore, ma posizionandolo tra parentesi lo trasforma in un 6, quindi lo usa. Detto questo, è brutto. :) – GManNickG

+0

@GMan: dovresti inserire questa risposta come risposta, in modo da poterla revocare. – Zacky112

risposta

13

Si sta utilizzando l'operatore virgola, esso valuta solo un valore (il più a destra).

L'operatore virgola (,) viene utilizzato per separare due o più espressioni sono inclusi dove è prevista una sola espressione . Quando il set di espressioni deve essere valutato per un valore , viene considerata solo l'espressione più a destra .

Source

L'indirizzo di memoria che il puntatore punta a viene inizializzato con un valore di 6 sopra.

+0

Poiché l'operatore (,) scarta il suo primo operando, è lo stesso di new int (6). Destra? – Stringer

+3

Sì, è corretto. Ma potresti avere qualche altra espressione invece di 5 che vorresti valutare e 6 restituire. Valuterà tutte le espressioni ma restituirà l'ultima. –

+1

http://msdn.microsoft.com/en-us/library/zs06xbxh(VS.80).aspx Ma a quel link Microsoft dice "Dove la virgola viene normalmente utilizzata come separatore (ad esempio in argomenti reali a funzioni o inizializzatori di aggregati), l'operatore virgola e i suoi operandi devono essere racchiusi tra parentesi. " Non l'espressione in int (espressione) conta come una lista di argomenti e quindi la virgola non dovrebbe essere valutata come un separatore? – Bob

1

Il mio compilatore, g ++, restituisce un errore quando si tenta di farlo.

Quale compilatore o codice hai visto?

+0

Visual Studio 2008. Ho scritto quel codice. – Stringer

+0

Compila in MSVC 6.0 e inizializza la posizione ptr con il valore 6. –

1

Credo che sia un bug che ha significato allocare una sorta di array 2D. Non puoi farlo in C++ comunque. Lo snippet viene effettivamente compilato perché utilizza l'operatore virgola, che restituisce l'ultima espressione e ignora i risultati di tutti gli altri. Ciò significa che l'istruzione è equivalente a:

int* ptr = new int(6); 
1

Il 5 viene ignorato. questo alloca un int sull'heap e lo inizializza su (5,6).

il risultato di una serie di istruzioni separate dall'operatore virgola è il valore dell'ultima istruzione, così int è inizializzato a 6

1

semplicemente fare ciò:

int* ptr = new int(6); 

Per quanto virgola l'operatore è interessato, usalo quando non puoi fare il compito desiderato senza di esso. Non v'è alcun uso di trucchi che applicano quali:

int* ptr = new int(5, 6);