使用c_str()时std :: string的未定义行为

时间:2016-08-22 16:43:09

标签: c++ string char copy

以下代码示例行为未定义..

char * getName()
{
   std::string name("ABCXYZ");
   return name.c_str();
}

这是因为名称超出了范围。但是我想了解当我们返回一个std :: string并且它不会产生未定义的行为时它是如何不同的?

2 个答案:

答案 0 :(得分:5)

当您return一个值时,该值会安全地返回给调用者。这就是return语句的作用。

如果您调用c_str,则返回的值是指向字符串的指针。一旦字符串被销毁,该指针现在指向任何特定的东西。值安全返回,只是没有任何东西可以安全地使用它。

string的值是字符串的内容。所以在这种情况下,它是传递给调用者的字符串的内容。可以说std::string类的主要目的是提供一个对象,其值是字符串的内容。

答案 1 :(得分:1)

只是因为返回指令复制或移动(参见C ++ 11 )返回的对象。

使用此代码:

++mask

字符串 name 将被复制并返回给调用者。

使用您的代码, return 将复制指针(因为您的函数返回指针),而不是指向对象的副本。那将产生一个UB。

相关问题