allocazione di memoria in C ++
-
21-08-2019 - |
Domanda
E 'possibile allocare un blocco di memoria arbitrario utilizzando l'operatore "nuovo"? In C posso farlo come "vuoto * p = malloc (7);" - questo assegnerà 7 byte se allineamento memoria è impostato a 1 byte. Come fare lo stesso in C ++ con l'operatore new?
Soluzione
blocchi di memoria arbitrari possono essere assegnate con operator new
in C ++; non con la new
operatore che è per costruzione di oggetti.
void* pBlock = ::operator new(7);
Tali blocchi possono essere successivamente liberati con operator delete
.
::operator delete(pBlock);
Si noti che si malloc
memoria allocata opportunamente allineato per qualsiasi tipo di oggetto, quindi l'applicazione potrebbe non allocare esattamente sette byte e non di più, ma lo stesso è (di solito) vale <=>. i clienti C di <=> solito bisogno di memoria allineato troppo.
Altri suggerimenti
Altri hanno risposto alla domanda come scritto, ma vorrei suggerire attaccare con malloc / libero per tali assegnazioni.
new e delete sono per l'assegnazione degli oggetti. Essi allocare la memoria necessaria e call costruttori / distruttori. Se si sa che basta un blocco arbitrario di memoria, utilizzando malloc e la connessione è perfettamente ragionevole.
Non è possibile assegnare un puntatore void
con operatore C ++ s 'new
: dovrete assegnare un tipo esplicito come char
o uint8_t
:
char *p = new char[7];
uint8_t *q = new uint8_t[7];
...
delete [] p;
delete [] q;
Sì, è possibile.
Ma a seconda di cosa si sta facendo ci possono essere le tecniche migliori.
Si può aggiornare la questione e dirci ciò che si sta cercando di ottenere. Con più contesto potrebbe essere fornita una soluzione migliore.
Un esempio:
Se steste assegnano dinamicamente un buffer per leggere da una presa (perché la dimensione non è noto al momento della compilazione). Un'alternativa sarebbe quella di utilizzare un vettore e dimensionare dinamicamente. È quindi possibile ottenere un puntatore alla parte interna del buffer prendendo l'indirizzo del primo elemento.
Personalmente avrei usato un std::vector<char>
. Non solo si ottiene un blocco arbitrario di byte ( garantito per essere contigui ), che li ottenete in un involucro Raii. Naturalmente, non c'è bisogno di utilizzare uno qualsiasi dei metodi std::vector
's (a parte, forse, resize()
), ma non c'è rigore che:
std::vector<char> buffer(7);
void* p = &buffer[0];
È possibile utilizzare un std::string
, ma <=> implica "questo oggetto contiene caratteri che hanno senso quando sono stampate," dove un <=> implica "questo oggetto contiene un gruppo arbitrario di byte".
Penso che potrebbe essere alla ricerca di Posizionamento Nuovo .
new char [7];
Tradizionalmente, char è un byte, anche se si potrebbe trovare alcune librerie che typedef un tipo BYTE.
Si può fare char* pBuffer = new char[7];
, e dal momento che il sizeof (char) è 1 byte è possibile utilizzarlo come un buffer di byte. Inoltre, ricordarsi di utilizzare delete[]
(con []) quando si rilascia la memoria.