Speicherzuordnung in C ++

8

Ist es möglich, einen beliebigen Speicherblock mit dem Operator "new" zu belegen? In C kann ich es tun wie "void * p = malloc (7);" - Dies wird 7 Bytes zuweisen, wenn die Speicherausrichtung auf 1 Byte eingestellt ist. Wie mache ich das gleiche in C ++ mit dem neuen Operator?

    
user132349 02.07.2009, 15:45
quelle

8 Antworten

43

Beliebige Speicherblöcke können in C ++ mit operator new belegt werden; nicht mit dem Operator new , der zum Konstruieren von Objekten dient.

%Vor%

Solche Blöcke können anschließend mit operator delete freigegeben werden.

%Vor%

Beachten Sie, dass operator new den Speicher für jede Art von Objekt passend ausrichtet, sodass die Implementierung möglicherweise nicht genau sieben Bytes und nicht mehr zuweist, aber dasselbe gilt (normalerweise) für malloc . C-Clients von malloc benötigen normalerweise auch ausgerichteten Speicher.

    
Charles Bailey 02.07.2009, 15:51
quelle
11

Andere haben die Frage wie geschrieben beantwortet, aber ich würde vorschlagen, für solche Zuweisungen bei malloc / free zu bleiben.

new und delete dienen zum Zuweisen von Objekten. Sie reservieren den benötigten Speicher und rufen Konstruktoren / Destruktoren auf. Wenn Sie wissen, dass Sie nur einen beliebigen Speicherblock benötigen, ist die Verwendung von malloc und free durchaus sinnvoll.

    
dma 02.07.2009 15:50
quelle
8

Sie können keinen void -Zeiger mit dem C ++ - Operator new zuweisen: Sie müssen einen expliziten Typ wie char oder uint8_t :

zuweisen %Vor%     
Adam Rosenfield 02.07.2009 15:46
quelle
3

Ja, das kannst du.
Aber abhängig davon, was Sie tun, kann es bessere Techniken geben.

Können Sie die Frage aktualisieren und uns mitteilen, was Sie erreichen möchten? Mit mehr Kontext könnte eine bessere Lösung bereitgestellt werden.

Ein Beispiel:
Wenn Sie einen Puffer dynamisch zuweisen, der aus einem Socket gelesen werden soll (weil die Größe zum Zeitpunkt der Kompilierung nicht bekannt ist). Eine Alternative wäre, einen Vektor zu verwenden und diesen dynamisch zu vergrößern. Sie können dann einen Zeiger auf das Innere des Puffers erhalten, indem Sie die Adresse des ersten Elements übernehmen.

    
Martin York 02.07.2009 16:16
quelle
3

Ich würde persönlich ein std::vector<char> verwenden. Sie erhalten nicht nur einen willkürlichen Block von Bytes () garantiert zusammenhängend sein ), erhalten Sie sie in einem RAII-Wrapper. Natürlich ist es nicht nötig, irgendwelche Methoden von std::vector zu benutzen (abgesehen von vielleicht resize() ), aber dafür gibt es keine Strafe:

%Vor%

Sie könnten std::string verwenden, aber std::string impliziert "dieses Objekt enthält Zeichen, die beim Ausdruck sinnvoll sind", wobei std::vector<char> impliziert, dass "dieses Objekt eine willkürliche Gruppe von Bytes enthält."

    
Max Lybbert 02.07.2009 18:00
quelle
2

Ich denke, Sie suchen vielleicht nach Placement New .

>     
Michael Kristofik 02.07.2009 15:46
quelle
2

neues Zeichen [7];

Traditionell ist char ein Byte, obwohl Sie möglicherweise einige Bibliotheken finden, die einen BYTE-Typ definieren.

    
Stefan Mai 02.07.2009 15:46
quelle
2

Sie können char* pBuffer = new char[7]; ausführen, und da die Größe von (char) 1 Byte ist, können Sie sie als Byte-Puffer verwenden. Denken Sie auch daran, delete[] (mit []) zu verwenden, wenn Sie den Speicher freigeben.

    
Naveen 02.07.2009 15:49
quelle

Tags und Links