C++ 返回是个好主意吗;常量字符*”;从一个函数?

C++ 返回是个好主意吗;常量字符*”;从一个函数?,c++,string,C++,String,现在我有了一个必须返回字符串的函数。我看到了一个特殊的实现,其中他从函数返回一个const char* 大概是这样的: const char * GetSomeString() { ........ return somestlstring.c_str(); } SomeOtherFoo () { const char * tmp = GetSomeString(); string s = tmp; } 现在我觉得这有点潜在的问题。我的直觉感觉对吗?或者这是一个完

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

大概是这样的:

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

SomeOtherFoo ()
{
  const char * tmp = GetSomeString();
  string s = tmp;
}
现在我觉得这有点潜在的问题。我的直觉感觉对吗?或者这是一个完全安全的代码

请给我你的建议。我感觉返回常量字符*这种方式可能会导致大破坏

谢谢,
Arjun

取决于somestlstring是什么以及在那里做了什么

如果它是一个局部变量,则在
GetSomeString
完成时,您正在将一个指针返回到正在释放的内存中,因此它是一个悬空指针和一个错误


这一切归结为
somestlstring
的生命周期以及对其执行的操作。
.c_str()
返回的指针保证仅在字符串中的下一个变异操作之前有效。因此,如果从调用
.c_str()
到构建
s
之前发生了一些变化,那么您将处于未定义的行为领域。

如果您询问
std::string
函数返回的
const char*
的生存期,在您修改从中获取它的字符串或销毁该字符串之前,它是有效的。如果您牢记这两个事实,从函数返回它是可以的(尽管我会说这不是一个很好的实践)。

这不是很好-字符串的内存可以保留多久?谁负责删除它?是否需要删除它

您最好返回一个负责分配和释放字符串内存的字符串对象——它可以是std::string,也可以是QString(如果您使用的是Qt),或者是CString(如果您使用的是MFC/ATL)


与此稍有不同的是,您的字符串会是unicode吗?大多数字符串类可以透明地处理unicode数据,但const char不会…

这取决于
somestsltstring
变量的位置

如果它是
GetSomeString()
函数的变量区域设置,那么这显然是错误的。实际上,
somestlstring
变量在函数末尾被销毁,因此
const char*
指向不再存在的东西


如果它是一个全局变量,那么这段代码是正确的。

在@Neil详述的条件下,这是可以的。但是,更好的方法是返回对字符串的引用

string const& GetSomeString() 
{ 
  ........   
  return somestlstring; 
}

string s = GetSomeString();
请记住,'somestlstring'不能是本地自动变量,而是存储在命名空间或类中的其他位置。否则,可以按值返回字符串

string GetSomeString() 
{ 
  ........   
  return somestlstring; // can be a local automatic variable
}

string s = GetSomeString();

要添加一些这样做可以的场景,请执行以下操作:

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

除非SomestString是函数范围内的本地字符串。:-)@康拉德:当然可以,但我在展示代码后的回答中也这么说了。:)