Manchmal ist es sinnvoll, die Startadresse einer std::vector
zu verwenden und diese Adresse vorübergehend als Adresse eines regelmäßig zugewiesenen Puffers zu behandeln.
Zum Beispiel ersetzen diese:C++: die Adresse des Anfangs eines std :: vector erhalten?
char* buf = new char[size];
fillTheBuffer(buf, size);
useTheBuffer(buf, size);
delete[] buf;
mit diesem:
vector<char> buf(size);
fillTheBuffer(&buf[0], size);
useTheBuffer(&buf[0], size);
Dies hat den Vorteil ist natürlich, dass der Puffer automatisch freigegeben wird, und ich muss die delete[]
nicht darum kümmern.
Das Problem, das ich damit habe, ist, wenn Größe == 0. In diesem Fall funktioniert die erste Version in Ordnung. Ein leerer Puffer ist "allokiert" und die nachfolgenden Funktionen haben keine Größe, sie erhalten die Größe == 0.
Die zweite Version schlägt jedoch fehl, wenn size == 0, da der Aufruf buf[0]
zu Recht eine Behauptung enthalten kann, die 0 < size
.
Gibt es eine Alternative zu dem Idiom &buf[0]
, die die Adresse des Beginns des Vektors zurückgibt, selbst wenn der Vektor leer ist?
Ich habe auch über die Verwendung buf.begin()
in Betracht gezogen, aber nach dem Standard ist es nicht einmal garantiert, einen Zeiger zurückzugeben.
Das sieht wie ein Versehen in der STL-Bibliothek aus. C++ erlaubt es Ihnen, 'new T [0]' zuzuordnen und gibt einen gültigen Zeiger für Situationen wie diesen zurück, aber die meisten Implementierungen der STL-Assertion, nur für den Fall, dass Sie diesem Element oder etwas zuweisen. – AshleysBrain
Wie würde es den Unterschied zwischen '& buf [0]' und 'buf [0] = 1 'wissen? – shoosh