不知是否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