在堆上分配C风格的字符串

时间:2010-11-28 18:56:09

标签: c++

伙计们,我需要一点技术帮助。 我在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
}

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

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

4 个答案:

答案 0 :(得分:5)

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

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

const char *getText()

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

return strdup("Hello");

答案 1 :(得分:1)

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

答案 2 :(得分:1)

使用std::string标题中的<string>。然后使用其.c_str()成员函数。然后你不必关心分配和释放:它正确地为你照顾它。

干杯&amp;第h。,

答案 3 :(得分:0)

  

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

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

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