现在我有一个必须返回一个字符串的函数。我看到了一个特殊的实现,他从函数中返回一个const char *。
这样的事情:
const char * GetSomeString()
{
........
return somestlstring.c_str();
}
SomeOtherFoo ()
{
const char * tmp = GetSomeString();
string s = tmp;
}
现在我觉得这有可能出现问题。我的直觉是否正确?或者这是一个非常安全的代码?
请给我你的建议。我有一种感觉返回const char *这种方式可能会导致破坏..
谢谢, 阿琼
答案 0 :(得分:26)
取决于somestlstring
是什么以及在那里做了什么。
如果它是一个局部变量,则返回一个指向正在GetSomeString
完成时释放的内存的指针,因此它是一个悬空指针和一个错误。
这一切归结为somestlstring
的生命周期以及您对其执行的操作。 .c_str()
返回的指针保证仅在字符串中的下一个变异操作时有效。因此,如果某个内容从调用somestlstring
变为.c_str()
,并且在构建s
之前,您将处于未定义的行为范围内。
答案 1 :(得分:6)
如果您询问const char *
std::string
函数返回的c_str()
的生命周期,它将一直有效,直到您修改从中获取的字符串,或直到该字符串为止销毁。如果你记住这两个事实,那么从函数中返回它是可以的(虽然我会说这不是很好的练习)。
答案 2 :(得分:3)
在@Neil阐述的条件下,这是可以的。但是更好的方法是返回对字符串的引用
string const& GetSomeString()
{
........
return somestlstring;
}
string s = GetSomeString();
仍然记住,'someomestlstring`不能是本地自动变量,而是存储在命名空间或类中的其他位置。否则,您可以按值返回字符串
string GetSomeString()
{
........
return somestlstring; // can be a local automatic variable
}
string s = GetSomeString();
答案 3 :(得分:2)
这不是很好 - 你的琴弦的记忆力有多长?谁负责删除它?是否需要删除?
你最好返回一个负责分配和释放字符串内存的字符串对象 - 这可能是一个std :: string,或者一个QString(如果你使用的是Qt),或CString(如果你'重新使用MFC / ATL)。
稍微不同的是,你的字符串是unicode吗?大多数字符串类可以透明地处理unicode数据,但const char不会...
答案 4 :(得分:1)
取决于somestlstring
变量所在的位置。
如果它是GetSomeString()
函数的变量区域设置,那么这显然是错误的。实际上,somestlstring
变量在函数末尾被销毁,因此const char *
指向不再存在的东西。
如果它是全局变量,则此代码是正确的。
答案 5 :(得分:1)
添加一些可以使用的方案:
somestlstring
是与GetSomeString()somestlstring
是非静态类成员,GetSomeString是该类的成员。在这种情况下,必须记录返回指针的生命周期(基本上 - 正如其他人所说 - 直到strign更改或对象被销毁)