2013-06-01 14 views
7

Ho avuto una domanda.C++ new * char non sono vuoti

Sviluppo server in ASIO e pacchetti in caratteri puntati.

Quando si crea un nuovo carattere (ad esempio char * buffer = new char[128];), è necessario pulirlo manualmente in null.

By:

for(int i =0;i<128;i++) 
{ 
buffer[i] = 0x00; 
} 

io facendo qualcosa di sbagliato, che char non è chiaro?

+0

La tua domanda ha già una risposta [le parentesi dopo il nome del tipo fanno la differenza con le novità?] (Http://stackoverflow.com/questions/620137/do-the-parentheses-after-the-type-name -fare-a-differenza-con-nuovo). – Troubadour

risposta

19

Non c'è bisogno di un ciclo su un array di valori non inizializzato. È possibile creare un'istanza dinamicamente serie di zeri in questo modo:

char * buffer = new char[128](); // all elements set to 0 
          ^^ 
3

La memoria allocata non sarà chiara, conterrà invece elementi casuali. Ecco come funziona l'allocazione della memoria. È necessario eseguire uno for -loop o utilizzare memset per cancellarlo manualmente.

-5

Poiché si tratta di un puntatore, si deve fare in quel modo:

for(int i = 0; i < 128; i++) 
{ 
(buffer + i) = 0x00; 
} 
+1

-1: Il codice è sbagliato (assegnando 0x00 al valore di rvalore) e il consiglio è sbagliato (il codice OP si compila, il tuo no). – milleniumbug

+0

1. Si è dimenticato di dereferenziare LHS, quindi si sta tentando di assegnare a r-value (il codice non verrà compilato). 2 'buffer [i]' è per standard di linguaggio uguale a '* (buffer + i)'. Mentre array e puntatori * ARE * diversi per standard di lingua in questo contesto sono in qualche modo intercambiabili. –

11

Ci sono due tipi di modi di chiamare il nuovo operatore in C++ - Default inizializzato a zero e inizializzato.

Per impostazione predefinita di inizializzazione (che lascerà l'indefinita value) chiamata:

int * i = new int; 

È allora behavoir indefinito per leggere o utilizzare questo valore fino a quando il suo stato impostato.

Per zeroinitialise (che sarà impostato a 0) utilizzare:

int * i = new int(); 

Questo funziona anche con le matrici:

int * i = new int[4]; // ints are not initialised, you must write to them before reading them 
int * i = new int[4](); // ints all zero initialised 

C'è un po 'di informazioni here

2

È anche possibile utilizzare calloc. Inizializza automaticamente ogni elem a 0. es:

char* buffer = (char *) calloc (128, sizeof (char)) 

primo param è il numero di blocchi da assegnare. Il secondo è la dimensione del blocco. Questa funzione restituisce void *, quindi devi convertirne il valore in (char *) Se usi calloc (o malloc o qualsiasi funzione di allocazione "pure c") è meglio usare la funzione free per deallocare la memoria anziché eliminare.