2011-01-26 106 views
1

這段代碼是否正常?使用std :: string構造函數複製const char *

void SomeClass :: foo(const char * _name) { 
    //name is of type const char * 
    name = std::string(_name).c_str(); 
} 

它看起來是工作,但IAM不知道,如果它是確定

應該怎麼做一個老同學的strcpy?

+2

WTF o_O。你傳遞給它一個`const char *`,轉換成`std :: string`並返回到`const char *`???究竟是什麼? – mingos 2011-01-26 11:47:24

+0

@mingos:我懷疑OP會發布這個問題,因爲對臨時性事物的範圍和生命週期存在一些不確定性,認爲創建一個字符串並提取`c_str()`可能以某種方式執行副本,而不必顯式地分配緩衝區並調用strcpy。對於新手C++程序員來說,這是一個完全合理的和常見的錯誤。 – 2011-01-26 11:55:07

回答

6

沒關係,因爲它編譯並且不會導致未定義的行爲。

這是不是 ok因爲在語句完成執行後名稱指向無效內存。

name = std::string(_name).c_str(); 

在本聲明結束時,臨時std :: string被銷燬,它釋放了c_str()的內存。

我應該做一個老派strcpy?

沒有,只是改變名稱是的std :: string:

void SomeClass :: foo(const char * _name) { 
    //name is of type std::string 
    name = _name; 
} 
2

如果你不name做任何事情,這是完全安全的。否則,它可能會在未來的某個隨機點失敗。由c_str()成員函數返回的C風格指針只在臨時std::string存在的情況下有效(並且只要不改變它,在這種情況下您不會改變它)。一旦封閉區域範圍退出,臨時區域就會被銷燬,任何使用name都會使你進入昏暗區域。

正如其他人所建議的,您應該將name轉換爲std::string。另外 - 如果你真的需要它保持char * - 你可以寫name = strdup(_name)

3

事後使用它並不好 - 只要暫時去,內存就可以被釋放。爲什麼你不使用字符串作爲成員?那麼你不必擔心內存管理。

1

在這種情況下,您將創建一個臨時對象並將其分配給您的指針。當你離開函數時,這個對象被銷燬,你的指針指向任何地方。 在你的情況下,它可能工作,因爲內存還沒有被覆蓋。但是你應該使用strcpy來避免這個問題。

0

我投給strcpy。爲什麼複雜簡單的事情?

甚至更​​好 - 因爲您顯然需要稍後使用它,爲什麼不將它轉換爲std::string並且隨後使用它,忘記所有這些char *

相關問題