关于string.c_str()生命周期

时间:2013-02-11 20:11:13

标签: c++ string

我想知道void func(const char *str);是否引用了有效的str,如果我写的如下:

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

与下面的代码有什么不同?

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

3 个答案:

答案 0 :(得分:8)

在这两种情况下,string对象都是临时的,在语句结束时被销毁。

在第一种情况下,str最终悬空 - 指向由临时string管理的内存,但现在已被销毁。对它做任何事都是一个错误,给出了未定义的行为。

在第二种情况下,临时string在函数返回之前不会被销毁。所以这很好,只要该函数不保持指针以供稍后使用的东西。

答案 1 :(得分:6)

不同之处在于,第一个创建了一个在第一个语句结束时被销毁的临时string对象,因此str成为一个悬空指针。第二个也创建一个临时的,但它在func的整个调用过程中都存在,因为临时对象在调用func之后才会被销毁。

答案 2 :(得分:3)

来自C ++ 11标准的第12.2 / 3段:

  

[...]临时对象作为评估全表达式(1.9)的最后一步被销毁,该表达式(词法上)包含创建它们的点。即使该评估以抛出异常结束,也是如此。 [...]

这意味着在包含对func()的调用的表达式中创建的临时值将一直存在,直到函数调用返回。

另一方面,第一个代码段中临时的生命周期将在调用func()之前结束,而str将悬空。这将导致未定义的行为。