Ist es sicher, std :: string an C-Style-APIs zu übergeben?

9

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?

    
masrtis 07.05.2013, 17:44
quelle

5 Antworten

9

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 .

    
Praetorian 07.05.2013, 17:46
quelle
5

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.

    
Nik Bougalis 07.05.2013 18:46
quelle
1

Ja, aber Sie müssen sie mit der c_str -Methode übergeben, um null- Kündigung.

    
hd1 07.05.2013 18:05
quelle
0

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.

    
user529758 07.05.2013 17:47
quelle
0
%Vor%

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.

    
utnapistim 07.05.2013 18:07
quelle

Tags und Links