【问题标题】:Allocating C-style string on the Heap在堆上分配 C 风格的字符串
【发布时间】:2010-11-28 18:56:09
【问题描述】:

各位,我需要一点技术帮助。 我在 C++ 中工作,没有太多的工作经验,但对这门语言有所了解。我需要使用 C 风格的字符串(char 数组),但我需要在堆上分配它。

如果你看一下这段非常简单的代码:

#include <iostream>
using namespace std;

char* getText()
{
    return "Hello";
}

int main()
{
    char* text;
    text = getText();
    cout << text;
    //delete text; // Calling delete results in an error
}

现在,我假设“Hello”字符串在堆栈上分配,在 getText() 中,这意味着一旦 getText 返回,指针就会“浮动”,对吗?

如果我是对的,那么将“Hello”放在堆上的最佳方法是什么,以便我可以在 getText 之外使用该字符串并在需要时在指针上调用 delete?

【问题讨论】:

    标签: c++


    【解决方案1】:

    不,那里没有隐藏的堆栈分配。 "Hello" 是静态数据,最终出现在您程序的 .data segment 中。

    这也意味着所有对getText 的调用都共享该字符串。如果您有大量错误消息映射到错误代码,则可以接受这种情况的常见用途。 strerror 之类的函数就是这样工作的,因此您可以获得标准库错误代码的描述性错误消息。但是没有人应该修改strerror的返回值(也因为它是const)。在您的情况下,您的函数定义应为:

    const char *getText()
    

    如果您确实想要返回的字符串的私有副本,可以使用strdup 函数进行复制:

    return strdup("Hello");
    

    【讨论】:

      【解决方案2】:

      使用来自&lt;string&gt; 标头的std::string。然后使用它的.c_str() 成员函数。然后您不必关心分配和释放:它会为您处理,正确。

      干杯,

      【讨论】:

      • 同意。这是 C++ 方式。你不应该在 C++ 中考虑 C 技术。
      • 听起来是最好的解决方案。我只需要能够返回一个指向字符串的指针。感谢所有回复的人:)
      【解决方案3】:

      这是不对的。 "Hello" 是一个静态字符串常量,它确实应该是 const char*。

      【讨论】:

        【解决方案4】:

        窄字符串文字的类型为“array of n const char”,其中 n 是字符串的大小,定义如下,并且具有静态存储持续时间

        静态存储既不是自动(“在堆栈上”)也不是动态(“在堆上”)。它是在程序实际运行之前分配的,因此指向字符串文字的指针永远不会变得无效。

        请注意,char* p = "Hello" 已被弃用,因为它很危险:类型系统无法阻止您尝试通过 p 更改字符串文字(这将导致 undefined behavior)。请改用const char* p = "Hello"

        【讨论】:

          猜你喜欢
          • 2011-11-24
          • 1970-01-01
          • 2011-07-22
          • 2021-03-14
          • 1970-01-01
          • 2011-05-14
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          相关资源
          最近更新 更多