不知是否void func(const char *str);
指有效str
,如果我寫如下:約string.c_str()生命週期
auto str = string("hello").c_str();
func(str);
它是如何從下面的代碼有什麼不同?
func(string("hello").c_str())
不知是否void func(const char *str);
指有效str
,如果我寫如下:約string.c_str()生命週期
auto str = string("hello").c_str();
func(str);
它是如何從下面的代碼有什麼不同?
func(string("hello").c_str())
從段落的C++ 11標準的12.2/3:
[...]臨時對象被銷燬作爲評價全表達式(1.9)的最後一個步驟,該步驟(詞法)包含它們的創建點。即使評估以拋出異常結束,情況也是如此。 [...]
這意味着在包含調用func()
的表達式內創建的臨時表將存在,直到函數調用返回。
在另一方面,臨時在第一代碼段的使用壽命將結束被調用之前func()
,和str
將被懸掛。這將導致未定義的行爲。
在這兩種情況下,string
對象都是臨時的,在聲明結尾銷燬。
在第一種情況下,str
結束懸空 - 指向由臨時string
管理的內存,但現在已被銷燬。用它做任何事情都是一個錯誤,給出未定義的行爲。
在第二種情況下,臨時string
直到函數返回後才被銷燬。所以這很好,只要函數沒有保留指針以供稍後使用的其他東西。
+1用於提及函數保留在指針上供以後使用的可能性。 – Carl 2013-02-11 20:19:45
+1''在聲明結尾臨時銷燬' – smilingpoplar 2013-02-11 20:20:19
不同之處在於第一個創建臨時對象string
在第一條語句結束時被銷燬,因此str
成爲懸掛指針。第二個也會創建一個臨時對象,但它在整個對func
的調用中都存在,因爲臨時對象只有在對func
的調用返回後纔會被銷燬。
好點。是的,臨時將在第一條語句結束時被銷燬,因爲對c_str()的調用實際上意味着str是一個const char *並且不是對字符串對象的引用(假定字符串與std :: string相同) – Carl 2013-02-11 20:18:22
你的意思是'func(str);'? – us2012 2013-02-11 20:14:15
你的意思是'func(「你好」);'? :-) – 2013-02-11 20:27:16