2013-04-12 4 views
5

Kann ich den Speicher des char * pointed string freigeben, nachdem ich ihn in einen std :: string konvertiert habe? Zum Beispiel:Kann ich den Speicher der Zeichenkette char * freigeben, wenn ich ihn std :: string zuweise?

char* c_string; 
c_string = strdup("This is a test"); 
std::string cpp_string; 
cpp_string(c_string); 
free(c_string); /* can I call free here? */ 
+0

vs2012 ist glücklich mit dem obigen Code außer '' std: string''. – gongzhitaao

+1

@gongzhitaao Nur weil Code kompiliert bedeutet nicht, dass es korrekt ist. Sie könnten sich immer noch auf undefiniertes Verhalten verlassen. Und 'std :: string' ist in C++ perfekt gültig. Sie haben wahrscheinlich vergessen, '' einzuschließen. –

+1

@It kompiliert und läuft korrekt. Ich nehme an, wenn es nicht freigegeben werden könnte, würde ein Laufzeitfehler auftreten. Was mehr bedeutet, was ich meine, ist '' std: string'' anstelle von '' std :: string''. Siehst du den Tippfehler? – gongzhitaao

Antwort

8

Ja. std::string kopiert die zugrunde liegende C-Zeichenfolge.

Quelle: Tabelle 67 von § 21.4.2 von C++ 11 Entwurf N3376.

+0

Vielen Dank für die schnelle Antwort – SSC

4

Ja. Der std::string-Konstruktor erstellt eine Kopie der Zeichenfolge, die an ihn übergeben wird.

Siehe Erbauer # 4 auf this page.

string (const char* s); // from c-string 

von c-string

Kopiert die nullterminierte Zeichensequenz (C-string) zeigte durch s.

+0

Vielen Dank für die schnelle Antwort – SSC

Verwandte Themen