我想知道如果我写void func(const char *str);的有效,str如果我写如下:
auto str = string("hello").c_str();
func(str);
Run Code Online (Sandbox Code Playgroud)
它与下面的代码有什么不同?
func(string("hello").c_str())
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,string对象都是临时的,在语句结束时被销毁.
在第一种情况下,str最终悬空 - 指向由临时管理的内存string,但现在已被销毁.对它做任何事都是一个错误,给出了未定义的行为.
在第二种情况下,临时string不会在函数返回之后销毁.所以这很好,只要该函数不保留指针以供稍后使用的其他东西.
不同之处在于,第一个创建了一个string在第一个语句结束时被销毁的临时对象,因此str成为一个悬空指针.第二个也创建一个临时的,但它在整个调用过程中都存在,func因为临时对象在调用func返回之后才会被销毁.