使用(str1 + str2).c_str()是否安全?
我testing了这个代码:
#include <iostream> #include <cstdio> #include <string> using namespace std; int main() { string s1("a"),s2("b"); const char * s = (s1+s2).c_str(); printf("%s\n",s); } 它返回“ab”。
 据我所知,由于(s1 +s2)是一个临时对象,并可能以某种方式消失(我不知道这个),然后const char * s可能指向未定义的内存,可能会被抛弃。 
 那么使用.c_str()这样的安全吗? 
在你的例子中这是不安全的。 但是在安全中是安全的
 printf("%s\n", (a + b).c_str()); 
 原因是临时值(如a + b的结果)在完整expression式的末尾被销毁。 在你的例子中, const char *存活了包含临时expression式的完整expression式,并且它是未定义的行为。 
“未定义的行为”最糟糕的部分是,事情可能显然工作无论如何…(UB代码崩溃,只有当你在包括你的父母的广大观众面前演示你的演示;-))
在这个例子中,我们可以引用标准:
12.2临时对象[class.temporary]
临时对象作为评估完整expression式(1.9)的最后一步被破坏(词法上)包含它们被创build的点。 即使评估以抛出exception结束,情况也是如此。 破坏临时对象的值计算和副作用仅与全expression式相关,而不与任何特定的子expression式相关联。
这是你的行分号后:
 const char * s = (s1+s2).c_str(); // <- Here 
所以在这里:
 printf("%s\n",s); // This line will now cause undefined behaviour. 
为什么? 因为当你的对象遭到破坏,你现在不知道这个地方是什么…
这里的坏事是,用未定义的行为 ,你的程序可能似乎在第一次工作,但是…在最糟糕的时候肯定会崩溃…
你可以做:
 printf( "%s\n", (s1+s2).c_str() ); 
它会工作,因为对象还没有被破坏(记住,分号后…)。
这是不安全的,但你可以很容易地分配给一个新的variables,并且指针将在该variables的范围内是安全的:
 string s1("a"), s2("b") , s3; s3 = s1 + s2; printf("%s\n", s3.c_str()); //other operations with s3 
 和大多数的编程结构一样,如果你正确地使用它,它是“安全的”,如果你是sl </s>的,它是不安全的。 在这种情况下,正确使用意味着注意对象的生命周期。  +运算符创build一个在语句结尾处被销毁的临时对象,并且在创build它的语句之后,返回的const char*不再有效。 所以你可以把c_str()的结果直接传给一个函数,但是你不能保存指针并在以后使用它。