2013-04-12 25 views
5

Czy mogę zwolnić pamięć char * wskazanego ciągu po przekonwertowaniu go na std :: string? Na przykład:Czy mogę zwolnić pamięć ciągu znaków char * podczas przydzielania go do std :: string?

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 jest zadowolony z powyższego kodu, z wyjątkiem '' std: string''. – gongzhitaao

+1

@gongzhitaao Tylko dlatego, że kompilacja kodu nie oznacza, że ​​jest poprawna. Nadal można polegać na niezdefiniowanym zachowaniu. A 'std :: string' jest całkowicie poprawny w C++. Prawdopodobnie zapomniałeś dodać ''. –

+1

@To kompiluje i działa poprawnie. Przypuszczam, że jeśli nie można go zwolnić, wystąpi błąd w czasie wykonywania. Co więcej, mam tu na myśli '' std: string'' zamiast '' std :: string''. Zobacz literówkę? – gongzhitaao

Odpowiedz

8

Tak. std::string kopiuje podstawowy ciąg znaków C.

Źródło: Tabela 67 z § 21.4.2 projektu C++ 11 N3376.

+0

Dziękuję za szybką odpowiedź – SSC

4

Tak. Konstruktor std::string tworzy kopię ciągu znaków przekazaną do niego.

Zobacz konstruktora nr 4 na this page.

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

z C-string

kopii sekwencji znaków zakończony zerem (C-string) wskazało s.

+0

Dziękuję za szybką odpowiedź – SSC

Powiązane problemy