从函数返回“const char *”是一个好主意吗?

时间:2010-03-25 10:06:45

标签: c++ string

现在我有一个必须返回一个字符串的函数。我看到了一个特殊的实现,他从函数中返回一个const char *。

这样的事情:

const char * GetSomeString() 
{ 
  ........   
  return somestlstring.c_str(); 
}

SomeOtherFoo ()
{
  const char * tmp = GetSomeString();
  string s = tmp;
}

现在我觉得这有可能出现问题。我的直觉是否正确?或者这是一个非常安全的代码?

请给我你的建议。我有一种感觉返回const char *这种方式可能会导致破坏..

谢谢, 阿琼

6 个答案:

答案 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()
  • 在同一翻译单元(.cpp)中初始化的全局变量
  • somestlstring是非静态类成员,GetSomeString是该类的成员。在这种情况下,必须记录返回指针的生命周期(基本上 - 正如其他人所说 - 直到strign更改或对象被销毁)
  • 您将char const *返回到文字或编译时初始化字符串