Es ist gut definiert, dass C ++ std :: vector an C-APIs weitergibt, die ein Ausgabe-Array wie folgt erwarten, weil std :: vector zusammenhängend ist:
%Vor%Ist es sicher, std :: string in gleicher Weise an C APIs zu übergeben? Gibt es im Standard C ++ 03 eine Garantie, dass std :: string zusammenhängend ist und in dieser Situation genauso funktioniert wie std :: vector?
Wenn die C-API-Funktion schreibgeschützten Zugriff auf den Inhalt von std::string
benötigt, verwenden Sie die% member-Funktion std::string::c_str()
, um die Zeichenfolge zu übergeben. Dies ist garantiert eine nullterminierte Zeichenfolge.
Wenn Sie den Parameter std::string
als out verwenden möchten, garantiert C ++ 03 nicht, dass die gespeicherte Zeichenfolge im Speicher zusammenhängend ist, aber C ++ 11. Bei letzterem ist es in Ordnung, die Zeichenfolge über operator[]
zu ändern, solange Sie das abschließende NULL-Zeichen nicht ändern .
Also, ich weiß, dass das bereits beantwortet wurde, aber ich habe Ihren Kommentar in Praetorian's Antwort gesehen:
Es ist ein OpenGL-Treiberfehler, der zu dem Rückgabewert für den Maximale Länge Zeichenfolge ist gebrochen. Sehen Zypern . glGetActiveAttrib versucht nicht, in den Zeiger zu schreiben, der von der zurückgegeben wird new [] -Aufruf mit der 0-Größenzuordnung, aber die Zeichenfolge ist nicht null beendet. Dann, später im Code, ist die nicht-null-terminierte Zeichenkette kopiert in eine std :: string zum Speichern, was zu einem Lesepuffer führt Überlauf. Sehr verwirrend für mich auch, und nur hier zu überprüfen, ob std :: string würde die Verfolgung erleichtern.
Uhm ... verzeih mir, aber wenn das dein Problem ist, dann scheinen all diese Lösungen übermäßig kompliziert zu sein. Wenn das Problem auf die Tatsache hinausläuft, dass Sie eine 0 als Puffergröße erhalten, die Sie benötigen (was bedeutet, dass Sie mit einer Zeichenfolge enden, die nicht NULL-terminiert ist, da es keinen Platz für den NULL-Terminator gibt), dann stellen Sie einfach sicher Ein NULL-Terminator ist immer vorhanden:
%Vor%Dies scheint mir die einfachste und vernünftigste Lösung zu sein.
Nein, das ist es nicht, aber allgemein, weil C-Strings als nullterminiert angenommen werden, was Ihr Zeiger auf char
nicht ist. (Wenn Sie string
verwenden, können Sie stattdessen string::c_str()
verwenden, das ist 0-terminiert.)
Wie auch immer, in C ++ 11 müssen die Elemente von vector
zusammenhängend im Speicher sein.
Wenn Ihr cStyleAPI
ein char * für die Eingabe erhält, dann ist std::string::c_str()
für.
Wenn es ein vorbelegtes Zeichen * für die Ausgabe erhält, dann no . In diesem Fall sollten Sie std::vector<char>
oder std::array<char>
verwenden.