2013-02-11 154 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