我想知道void func(const char *str);
是否引用了有效的str
,如果我写的如下:
auto str = string("hello").c_str();
func(str);
与下面的代码有什么不同?
func(string("hello").c_str())
答案 0 :(得分:8)
在这两种情况下,string
对象都是临时的,在语句结束时被销毁。
在第一种情况下,str
最终悬空 - 指向由临时string
管理的内存,但现在已被销毁。对它做任何事都是一个错误,给出了未定义的行为。
在第二种情况下,临时string
在函数返回之前不会被销毁。所以这很好,只要该函数不保持指针以供稍后使用的东西。
答案 1 :(得分:6)
不同之处在于,第一个创建了一个在第一个语句结束时被销毁的临时string
对象,因此str
成为一个悬空指针。第二个也创建一个临时的,但它在func
的整个调用过程中都存在,因为临时对象在调用func
之后才会被销毁。
答案 2 :(得分:3)
来自C ++ 11标准的第12.2 / 3段:
[...]临时对象作为评估全表达式(1.9)的最后一步被销毁,该表达式(词法上)包含创建它们的点。即使该评估以抛出异常结束,也是如此。 [...]
这意味着在包含对func()
的调用的表达式中创建的临时值将一直存在,直到函数调用返回。
另一方面,第一个代码段中临时的生命周期将在调用func()
之前结束,而str
将悬空。这将导致未定义的行为。