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?
Beliebige Speicherblöcke können in C ++ mit operator new
belegt werden; nicht mit dem Operator new
, der zum Konstruieren von Objekten dient.
Solche Blöcke können anschließend mit operator delete
freigegeben werden.
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.
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.
Sie können keinen void
-Zeiger mit dem C ++ - Operator new
zuweisen: Sie müssen einen expliziten Typ wie char
oder uint8_t
:
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.
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:
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."
neues Zeichen [7];
Traditionell ist char ein Byte, obwohl Sie möglicherweise einige Bibliotheken finden, die einen BYTE-Typ definieren.
Tags und Links memory c++ new-operator