這段代碼是否正常?使用std :: string構造函數複製const char *
void SomeClass :: foo(const char * _name) {
//name is of type const char *
name = std::string(_name).c_str();
}
它看起來是工作,但IAM不知道,如果它是確定
應該怎麼做一個老同學的strcpy?
這段代碼是否正常?使用std :: string構造函數複製const char *
void SomeClass :: foo(const char * _name) {
//name is of type const char *
name = std::string(_name).c_str();
}
它看起來是工作,但IAM不知道,如果它是確定
應該怎麼做一個老同學的strcpy?
沒關係,因爲它編譯並且不會導致未定義的行爲。
這是不是 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;
}
如果你不name
做任何事情,這是完全安全的。否則,它可能會在未來的某個隨機點失敗。由c_str()
成員函數返回的C風格指針只在臨時std::string
存在的情況下有效(並且只要不改變它,在這種情況下您不會改變它)。一旦封閉區域範圍退出,臨時區域就會被銷燬,任何使用name
都會使你進入昏暗區域。
正如其他人所建議的,您應該將name
轉換爲std::string
。另外 - 如果你真的需要它保持char *
- 你可以寫name = strdup(_name)
。
事後使用它並不好 - 只要暫時去,內存就可以被釋放。爲什麼你不使用字符串作爲成員?那麼你不必擔心內存管理。
在這種情況下,您將創建一個臨時對象並將其分配給您的指針。當你離開函數時,這個對象被銷燬,你的指針指向任何地方。 在你的情況下,它可能工作,因爲內存還沒有被覆蓋。但是你應該使用strcpy來避免這個問題。
我投給strcpy
。爲什麼複雜簡單的事情?
甚至更好 - 因爲您顯然需要稍後使用它,爲什麼不將它轉換爲std::string
並且隨後使用它,忘記所有這些char *
?
WTF o_O。你傳遞給它一個`const char *`,轉換成`std :: string`並返回到`const char *`???究竟是什麼? – mingos 2011-01-26 11:47:24
@mingos:我懷疑OP會發布這個問題,因爲對臨時性事物的範圍和生命週期存在一些不確定性,認爲創建一個字符串並提取`c_str()`可能以某種方式執行副本,而不必顯式地分配緩衝區並調用strcpy。對於新手C++程序員來說,這是一個完全合理的和常見的錯誤。 – 2011-01-26 11:55:07