好的,COVERITY是正确的。你当前的方法会失败的原因是因为在函数内部创建的std::string
实例只有在函数运行期间才有效。一旦程序离开函数的作用域,std::string的析构函数就会被调用,这将是你的字符串的终结。
但如果你想要一个C字符串,怎么样...
const char * returnCharPtr()
{
std::string someString;
char * new_string = new char[someString.length() + 1];
std::strcpy(new:string, someString.c_str());
return new_string;
}
但是等等……这几乎就像返回一个
std::string
一样,不是吗?
std::string returnCharPtr()
{
std::string someString;
return new_string;
}
这将把您的字符串复制到函数作用域之外的新字符串中。它可以工作,但确实会创建一个新副本。
由于返回值优化,这将不会创建副本(感谢所有纠正!)。
因此,另一个选项是将参数作为参数传递,这样您就可以在函数中处理字符串,但不会创建新副本:
void returnCharPtr(std::string & someString)
{
}
如果你想使用C-Strings,你需要注意字符串的长度:
void returnCharPtr(char*& someString, int n)
{
}
std::string
这样的东西被发明出来的主要原因。你所发明的任何东西都几乎不可避免地会成为 1)std::string
已经做过的重复品,或者2)有缺陷的产品。 - Jerry Coffinconst char*
更加合理。您有充分的理由移除[C]标签吗? - Yakk - Adam Nevraumontchar*
的生命周期在C代码中如何管理?如果不是,为什么要在帖子上打上[C]标签? - Yakk - Adam Nevraumont