以下代码示例行为未定义..
char * getName()
{
std::string name("ABCXYZ");
return name.c_str();
}
这是因为名称超出了范围。但是我想了解当我们返回一个std :: string并且它不会产生未定义的行为时它是如何不同的?
答案 0 :(得分:5)
当您return
一个值时,该值会安全地返回给调用者。这就是return
语句的作用。
如果您调用c_str
,则返回的值是指向字符串的指针。一旦字符串被销毁,该指针现在指向任何特定的东西。值是安全返回,只是没有任何东西可以安全地使用它。
string
的值是字符串的内容。所以在这种情况下,它是传递给调用者的字符串的内容。可以说std::string
类的主要目的是提供一个对象,其值是字符串的内容。
答案 1 :(得分:1)
只是因为返回指令复制或移动(参见C ++ 11 )返回的对象。
使用此代码:
++mask
字符串 name 将被复制并返回给调用者。
使用您的代码, return 将复制指针(因为您的函数返回指针),而不是指向对象的副本。那将产生一个UB。