2013-02-11 156 views
3

不知是否void func(const char *str);指有效str,如果我寫如下:約string.c_str()生命週期

auto str = string("hello").c_str(); 
func(str); 

它是如何從下面的代碼有什麼不同?

func(string("hello").c_str()) 
+0

你的意思是'func(str);'? – us2012 2013-02-11 20:14:15

+0

你的意思是'func(「你好」);'? :-) – 2013-02-11 20:27:16

回答

3

從段落的C++ 11標準的12.2/3:

[...]臨時對象被銷燬作爲評價全表達式(1.9)的最後一個步驟,該步驟(詞法)包含它們的創建點。即使評估以拋出異常結束,情況也是如此。 [...]

這意味着在包含調用func()的表達式內創建的臨時表將存在,直到函數調用返回。

在另一方面,臨時在第一代碼段的使用壽命將結束被調用之前func(),和str將被懸掛。這將導致未定義的行爲。

8

在這兩種情況下,string對象都是臨時的,在聲明結尾銷燬。

在第一種情況下,str結束懸空 - 指向由臨時string管理的內存,但現在已被銷燬。用它做任何事情都是一個錯誤,給出未定義的行爲。

在第二種情況下,臨時string直到函數返回後才被銷燬。所以這很好,只要函數沒有保留指針以供稍後使用的其他東西。

+0

+1用於提及函數保留在指針上供以後使用的可能性。 – Carl 2013-02-11 20:19:45

+0

+1''在聲明結尾臨時銷燬' – smilingpoplar 2013-02-11 20:20:19

6

不同之處在於第一個創建臨時對象string在第一條語句結束時被銷燬,因此str成爲懸掛指針。第二個也會創建一個臨時對象,但它在整個對func的調用中都存在,因爲臨時對象只有在對func的調用返回後纔會被銷燬。

+0

好點。是的,臨時將在第一條語句結束時被銷燬,因爲對c_str()的調用實際上意味着str是一個const char *並且不是對字符串對象的引用(假定字符串與std :: string相同) – Carl 2013-02-11 20:18:22