2012-12-10 22 views
31

Eventuali duplicati:
is this a variable or functionCosa fa "new int (100)"?

ho erroneamente usato qualcosa come:

int *arr = new int(100); 

e passa la compilazione, ma sapevo che questo è sbagliato. Dovrebbe essere

int *arr = new int[100]; 

Cosa fa il compilatore a pensare che è quando ho scritto quella sbagliata?

risposta

56

La prima riga assegna un singolo int e lo inizializza su 100. Pensa al numero int(100) come chiamata del costruttore.

Poiché si tratta di un'assegnazione scalare, tentare di accedere a arr[1] o liberare memoria utilizzando delete[] comporterebbe un comportamento non definito.

+5

@RedX: Se stai pensando di posizionamento 'new', questo non è vero (la sintassi è diversa). – NPE

+14

@RedX: no, punterà ad un indirizzo allocato dinamicamente che contiene il valore 'int' 100. Stai pensando a' int * arr = (int *) 100; ' –

+4

@SteveJessop Oppure, come suggerito da NPE, 'new (100) int'. –

8

Alloca un oggetto di tipo int e lo inizializza sul valore 100.

Un sacco di gente non sa che è possibile passare un inizializzatore per new, c'è un particolare linguaggio che dovrebbe essere reso più ampiamente conosciuto in modo da evitare l'uso di memset:

new int[100](); 

Questa assegnerà un array di int e inizializzazione a zero dei suoi elementi.

Inoltre, non utilizzare una versione di array di new. Mai. C'è std::vector per quello scopo.

+1

"un particolare idioma che dovrebbe essere reso più noto ... non dovresti usare una versione di array di nuovo." - quindi perché l'idioma dovrebbe essere più ampiamente conosciuto? ;-) –

+1

@SteveJessop, buon punto :) Sebbene quando si aggiusta una vecchia base di codice, è molto più facile cancellare 'memset's e aggiungere parentesi piuttosto che sostituire' new' con 'vector'. – avakar

+0

@avakar, non ho ancora capito cosa si intende per ... new int [100](); qualcun altro elaborato possibilmente con un esempio – eRaisedToX

0

Il primo crea un singolo nuovo numero intero, lo inizializza sul valore 100 e restituisce un puntatore ad esso.

In C/C++ non c'è differenza tra un puntatore a un array e un puntatore a un valore singolo (un puntatore a un array è in realtà solo un puntatore al suo primo elemento). Quindi questo è un modo valido per creare un array con un elemento.

+4

Un puntatore a un array assomiglia a 'int (* arr) [100]' e C++ può distinguere. È solo che 'new' non restituisce un puntatore a un array anche quando si assegna un array, ma restituisce un puntatore al primo elemento dell'array. Il motivo è che la dimensione fa parte del tipo di un puntatore-a-array, e naturalmente 'new' non può restituire un tipo diverso a seconda di quale dimensione lo passi in fase di esecuzione. –

+2

Dovrebbe essere "C++ non può distinguere tra un puntatore a un elemento di una matrice e un puntatore a un singolo valore." –

21

Wikipedia new(C++) citazione:

int *p_scalar = new int(5); //allocates an integer, set to 5. (same syntax as constructors) 
int *p_array = new int[5]; //allocates an array of 5 adjacent integers. (undefined values) 
+1

+1 per una citazione. – Richard

+2

@Richard ma mi è stato insegnato che Wikipedia non è una fonte affidabile! –

+4

@AlvinWong Non lo è, quasi per definizione. L'unica fonte "affidabile" (per questo problema) sarebbe lo standard C++ (che è quello che dovresti citare, se stai citando qualcosa). –