Grundsätzlich gibt es zwei Haupt-C++ - Wege zur Auswahl:
std::vector
std::unique_ptr
Ich würde die zweite bevorzugen, da Sie nicht alle die automatische Größenänderung Zeug in std::vector
benötigen, und Sie brauchen keinen Container - Sie brauchen nur einen Puffer.
std::unique_ptr
hat eine Spezialisierung für dynamische Arrays: std::unique_ptr<int[]>
nennen delete []
in seinem destructor, und werden Sie mit entsprechenden operator []
.
Wenn Sie den Code wollen:
std::unique_ptr<char[]> buffer(new char [size]);
some_io_function(buffer.get(), size); // get() returnes raw pointer
Unfortunatelly, ist es nicht eine Möglichkeit haben, die Größe des Puffers abrufen, so dass Sie es in einer Variablen zu speichern haben.Wenn es Sie verwirrt, dann tun std::vector
die Arbeit:
std::vector<char> buffer(size);
some_io_function(buffer.data(), buffer.size()); // data() returnes raw pointer
Wenn Sie den Puffer um passieren wollen, hängt davon ab, wie genau Sie es tun.
Betrachten Sie den folgenden Fall: Der Puffer wird irgendwo gefüllt, dann woanders verarbeitet, für einige Zeit gespeichert, dann irgendwo geschrieben und zerstört. Es passiert, dass Sie nie wirklich zwei Stellen im Code brauchen, um den Puffer zu besitzen, und Sie können einfach std::move
von Ort zu Ort gehen. Für diesen Anwendungsfall funktioniert std::unique_ptr
perfekt und schützt Sie vor gelegentlichen Kopieren des Puffers (während Sie mit std::vector
können Sie es versehentlich kopieren, und kein Fehler oder Warnung wird auftreten).
Wenn Sie im Gegensatz dazu mehrere Stellen im Code benötigen, um denselben Puffer zu speichern (vielleicht wird er an mehr als einer Stelle gleichzeitig gefüllt/verarbeitet), benötigen Sie definitiv std::shared_ptr
. Leider hat es nicht Array-artige Spezialisierung, so dass Sie entsprechende deleter passieren müssen:
std::shared_ptr<char> buffer(new char[size], std::default_delete<char[]>());
Die dritte Option ist, wenn Sie wirklich den Puffer kopieren müssen. Dann wird std::vector
einfacher sein. Aber, wie ich bereits erwähnt habe, ich fühle, dass es nicht der beste Weg ist. Außerdem können Sie immer den Puffer halten, kopieren, indem std::unique_ptr
oder std::shared_ptr
manuell, was eindeutig dokumentiert Ihre Absicht:
std::uniqure_ptr<char[]> buffer_copy(new char[size]);
std::copy(buffer.get(), buffer.get() + size, buffer_copy.get());
'std :: vector'. Immer 'std :: vector'. naja ... fast außer du hast einen sehr guten Grund. – bolov
Ab C++ 11 können Sie sogar mit '.data()' auf den rohen Speicher hinter einem Vektor zugreifen. –
@StefanoSanfilippo: Immer mit '& front()' (nur für nicht-leere, gewährt) –