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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top