[英]Improper use of c_str
我有一個定義如下的方法:
const std::string returnStringMethod()
{
std::string myString;
// populate myString
return myString;
}
現在,在調用者中,我做了類似這樣的事情:
const char * ptr = returnStringMethod().c_str();
正如我所看到的,這是返回一些我沒想到的截斷字符串。 但是,以下工作正常:
std::string str = returnStringMethod();
const char * ptr = str.c_str();
有人可以幫我理解這里發生的事情嗎? 。
PS:我們每周構建一次代碼。 我上周提交代碼時測試了這個,事情還不錯。 所以,我真的想知道我在這里可能缺少什么。
謝謝,帕萬。
第一個是未定義的行為,臨時的returnStringMethod()
僅在尾隨時才有效;
,所以內部字符串(由c_str()
返回)被銷毀,所以你留下了一個懸空指針。
第二個版本是有效的,因為str
將在其范圍結束時被銷毀,並且其范圍與ptr
相同(至少在您的示例中)。
例如,以下也是錯誤的:
const char * ptr = NULL;
{
std::string str = returnStringMethod();
ptr = str.c_str();
}
在}
之后, ptr
不再有效。
returnStringMethod
的返回值是一個臨時字符串,其生命周期綁定到表達式本身; 這意味着在const char * ptr = returnStringMethod ().c_str ()
初始化ptr
之后,將立即銷毀調用c_str
的std::string
。
這意味着ptr
已被初始化的值與指向內存的點不再可訪問。
在后一種情況下,將returnStringMethod
的返回值分配給std::string str
您將擁有一個生命周期綁定到當前范圍的副本。 將str.c_str ()
的值賦值給ptr
只要str
處於活動狀態就有效。
const char * ptr = returnStringMethod().c_str();
在上面的行中,函數返回臨時字符串,該函數很快就會超出范圍。 (並且調用析構函數並釋放內存)
在以后的版本中,您可以創建字符串的本地副本,從而定義行為。
您還可以使用以下內容
const std::string &str = returnStringMethod();
const char * ptr = str.c_str();
使用const引用會延長臨時變量的生命周期,直到引用在范圍內,並且不存在(顯式)不需要的副本。
你正在返回一個(臨時)副本,那就是你執行c_str()的地方。
當臨時消失時,c_str()返回的char *變為無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.