【问题标题】:c++ char array out of scope or not?c++ char数组是否超出范围?
【发布时间】:2010-10-25 10:30:00
【问题描述】:

我有一个需要const char 指针作为输入的方法(不是以空结尾的)。这是我在项目中使用的库 (TinyXML) 的要求。我从string.c_str() 方法调用中获取此方法的输入。

这个char指针需要删除吗?调用完成后字符串立即超出范围;所以字符串应该用它的析构函数来删除它,对吗?

【问题讨论】:

  • 只是出于好奇,是什么方法?

标签: c++ string memory-management stl


【解决方案1】:

std::string.c_str() 返回一个指向空终止字符串的指针。实际的字符数组仍归std::string 对象所有,只要:

  1. std::string 对象有效,并且
  2. 不调用 std::string 对象上的非 const 成员函数(即修改字符串会使之前指向的任何 C 样式字符串无效)。

由字符串对象本身来分配和释放它返回给你的空字符数组。

您始终可以将空终止字符串用作非空终止字符串。毕竟,NTS 只是一个非 NTS,末尾有一个额外的零。只要字符串按照函数的预期正确终止,它就永远不会看到“额外的”空值。

【讨论】:

  • 谢谢 Wuggy。我刚刚发布了您对(其他)汤姆帖子的评论。
【解决方案2】:

string.c_str() 返回的 char 数组是空终止的。 如果 tinyXML 的函数采用非空终止的 char* 缓冲区,那么您可能会得到一些意外行为。

const char* c_str ( ) const;

获取等效的 C 字符串

生成一个空终止序列 相同的字符(c-string) 内容作为字符串对象和 将其作为指向数组的指针返回 字符。

终止空字符是 自动附加。

不,它不需要被释放。 String 的析构函数会为你做这件事。

返回的数组指向一个 内部位置与所需 这个序列的存储空间 字符加上它的终止 空字符,但这个值 数组不应该被修改 程序,并且只被授予保留 直到下一次调用 a 的非常量成员函数 字符串对象。

Source

【讨论】:

  • 我怀疑微型 XML 的函数会以空字符结尾的字符 * 出错。毕竟,大小并不是仅仅通过指针就可以确定的。此外,如果您有任意 char*,则您分配的内存之后的内存可能有一个空字符。我有一种感觉 Jack BeNimble 只是想强调参数不必是典型的 c 字符串。 (Ps - 这是与海报不同的汤姆 :-))
  • 大声笑,有一两秒钟很困惑 :-) 我是第一个来的!一个方法要求“非空终止字符指针”这一事实对我来说也很奇怪,这就是为什么我要求提供 Tiny xml 方法的名称。 (这是汤姆,海报。)
  • Tom(发帖人):请编辑您的答案以删除有关 nul 终止字符串的错误内容。然后汤姆(另一个)可以删除他的评论,你可以删除你的,我可以删除我的。
【解决方案3】:

另一方面,
如果您不需要 char 指针以空终止,那么您最好使用 str.data() 而不是 str.c_str()。不同之处在于.data() 不会授予您所获得的内容将被空终止。如果您的字符串恰好占据了string 分配的内部缓冲区的整个长度,这很有用。在这种情况下,调用.c_str() 将强制string 将日期重新分配给一个新的更大的缓冲区,该缓冲区包含足够的空间来最后添加'\0'

无论如何,你当然不应该删除返回的指针。 string 会解决这个问题。

【讨论】:

  • +1 因为我喜欢你的观点,你可以通过调用 .data() 来保存重新分配。我从来没有意识到它的存在。我想我必须假设 std::string 总是为调用 c_str() 保留一个空终止符。很高兴知道:-)。
【解决方案4】:

不要删除从 std::string::c_str 获得的内存。字符串对此负责(完全有可能它给了你一个指向其内部缓冲区的指针,所以如果你删除它,那将是一件坏事(tm)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2013-08-12
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多