Using operator [] on empty std :: vector

Ich wurde vor einer Weile darauf hingewiesen, dass es allgemein üblich ist, @ zu verwendstd :: vector als ausnahmesicheres dynamisches Array in c ++ anstatt rohe Arrays zuzuweisen ... zum Beispiel

{
    std::vector<char> scoped_array (size);
    char* pointer = &scoped_array[0];

    //do work

} // exception safe deallocation

Ich habe diese Konvention mehrmals ohne Probleme verwendet, aber ich habe vor kurzemEinen Code nach Win32 portiert VisualStudio2010 (vorher nur unter MacOS / Linux) und meinunit-Tests brechen ab (stdlib wirft einen Assert aus), wenn die Vektorgröße zufällig Null ist.

ch verstehe, dass das Schreiben in ein solches Array ein Problem darstellen würde, aber diese Annahme unterbricht diese Lösung als Ersatz für rohe Zeiger. Betrachten Sie die folgenden Funktionen mitn = 0

void foo (int n) {
   char* raw_array = new char[n];
   char* pointer = raw_array;
   file.read ( pointer , n );
   for (int i = 0; i < n; ++i) {
      //do something
   }
   delete[] raw_array;
}

Während wohl überflüssig, ist der obige Code vollkommen legal (glaube ich), während der folgende Code eine Behauptung auf VisualStudio2010 auslöst

void foo (int n) {
   std::vector<char> scoped_array (n);
   char* pointer = &scoped_array[0];
   file.read ( pointer , n );
   for (int i = 0; i < n; ++i) {
  //do something
   }
}

Wurde ich die ganze Zeit undefiniertes Verhalten verwenden? Ich habe unter dem Impressionsoperator [] keine Fehlerprüfung durchgeführt und dies war eine gültige Verwendung von std :: vector <>. Hat jemand dieses Problem festgestellt?

--bearbeiten Danke für all die nützlichen Antworten, als Antwort auf Leute, die sagen, es sei undefiniertes Verhalten. Gibt es eine Möglichkeit, die obige unformatierte Arrayzuordnung zu ersetzen, die mit @ funktioniern = 0?

Während ich sage, dass ich nach @ suc n = 0 als Ausnahmefall wird das Problem lösen (es wird). Es gibt viele Muster, in denen kein Sonderfall erforderlich ist (wie im obigen Beispiel für einen rohen Zeiger), sodass möglicherweise etwas anderes als std :: vector <> verwendet werden muss?

Antworten auf die Frage(14)

Ihre Antwort auf die Frage