Selbst wenn Sie wissen, dass sie dasselbe tun oder dass .data () .c_str () aufruft, ist es nicht richtig anzunehmen, dass dies bei anderen Compilern der Fall ist. Es ist auch möglich, dass sich Ihr Compiler mit einer zukünftigen Version ändert.
2 Gründe für die Verwendung von std :: string:
std :: string kann sowohl für Text als auch für beliebige Binärdaten verwendet werden.
//Example 1
//Plain text:
std::string s1;
s1 = "abc";
//Example 2
//Arbitrary binary data:
std::string s2;
s2.append("a\0b\0b\0", 6);
Sie sollten die Methode .c_str () verwenden, wenn Sie Ihre Zeichenfolge als Beispiel 1 verwenden.
Sie sollten die .data () -Methode verwenden, wenn Sie Ihre Zeichenfolge als Beispiel 2 verwenden. Nicht, weil die Verwendung von .c_str () in diesen Fällen gefährlich ist, sondern weil es expliziter ist, dass Sie mit Binärdaten für andere Überprüfungen arbeiten dein Code.
Mögliche Gefahr bei der Verwendung von .data ()
Der folgende Code ist falsch und kann einen Segfault in Ihrem Programm verursachen:
std::string s;
s = "abc";
char sz[512];
strcpy(sz, s.data());//This could crash depending on the implementation of .data()
Warum ist es für Implementierer üblich, dass .data () und .c_str () dasselbe tun?
Weil es effizienter ist. Die einzige Möglichkeit, .data () dazu zu bringen, etwas zurückzugeben, das nicht nullterminiert ist, besteht darin, .c_str () oder .data () ihren internen Puffer kopieren zu lassen oder nur 2 Puffer zu verwenden. Ein einzelner nullterminierter Puffer bedeutet immer, dass Sie bei der Implementierung von std :: string immer nur einen internen Puffer verwenden können.
.data()
konstante Überladung für , sodass sie für nicht konstante Zeichenfolgen nicht mehr gleichwertig sind.