【问题标题】:Is it a good idea to return " const char * " from a function?从函数返回“ const char * ”是个好主意吗?
【发布时间】:2020-09-29 07:15:26
【问题描述】:

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

类似这样的:

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

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

现在我觉得这可能有问题。我的直觉对吗?还是这是一个完全安全的代码?

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

谢谢, 阿琼

【问题讨论】:

    标签: c++ string


    【解决方案1】:

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

    如果它是一个局部变量,则您将返回一个指向内存的指针,该指针在 GetSomeString 完成时被释放,因此它是一个悬空指针并且是一个错误。

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

    【讨论】:

      【解决方案2】:

      如果您询问std::string c_str() 函数返回的const char * 的生命周期,它在您修改从中获取它的字符串或直到字符串被销毁之前是有效的。从函数中返回它是可以的(虽然我会说这不是很好的做法),只要你牢记这两个事实。

      【讨论】:

        【解决方案3】:

        这不是很好 - 你的字符串的记忆会持续多久?谁负责删除它?是否需要彻底删除?

        你最好返回一个负责分配和释放字符串内存的字符串对象——这可能是一个 std::string 或一个 QString(如果你使用 Qt)或 CString(如果你重新使用 MFC / ATL)。

        稍微不同的是,你的字符串会是 unicode 吗?大多数字符串类可以透明地处理 unicode 数据,但 const char 不会...

        【讨论】:

          【解决方案4】:

          这取决于somestlstring 变量的位置。

          如果它是GetSomeString() 函数的变量语言环境,那么这显然是错误的。事实上,somestlstring 变量在函数结束时被销毁,因此 const char * 指向的东西不再存在。

          如果是全局变量,那么这段代码是对的。

          【讨论】:

            【解决方案5】:

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

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

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

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

            【讨论】:

            • 除非 somestlstring 在函数范围内是局部的。 :-)
            • @Konrad 当然,但我也在我展示代码后的回答中说过。 :)
            【解决方案6】:

            添加一些可以这样做的场景:

            • somestlstring 是在与 GetSomeString() 相同的翻译单元 (.cpp) 中初始化的全局变量
            • somestlstring 是非静态类成员,GetSomeString 是该类的成员。在这种情况下,必须记录返回的指针的生命周期(基本上 - 正如其他人所说 - 直到字符串发生变化或对象被破坏)
            • 您将 char const * 返回到文字或编译时初始化字符串

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-10-16
              • 2012-05-26
              • 1970-01-01
              • 1970-01-01
              • 2012-02-18
              • 2013-11-25
              • 1970-01-01
              相关资源
              最近更新 更多