代码之家  ›  专栏  ›  技术社区  ›  Jack BeNimble

C++字符数组是否超出范围?

  •  1
  • Jack BeNimble  · 技术社区  · 16 年前

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

    是否需要删除此字符指针?调用完成后,字符串立即超出范围;因此字符串应该用其析构函数调用删除它,对吗?

    4 回复  |  直到 16 年前
        1
  •  8
  •   Tom    16 年前

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

    常量char*c_str()const;

    获取等效C字符串

    生成以空结尾的序列 具有相同字符(C字符串)的 内容作为字符串对象和 将其作为指向数组的指针返回 字符。

    终止的空字符是 自动附加。

    不,不需要释放。字符串的析构函数为您做这个。

    返回的数组指向 内部位置 此序列的存储空间 字符及其终止 空字符,但 不应在中修改数组 程序,只允许保留 直到下一次呼叫 的非常量成员函数 字符串对象。

    来源: http://www.cplusplus.com/reference/string/string/c_str/

        2
  •  10
  •   Logan Capaldo    16 年前

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

        3
  •  4
  •   shoosh    16 年前

    另一方面,
    如果不需要char指针以NULL结尾,那么最好使用 str.data() 而不是 str.c_str() . 区别在于 .data() 不能保证你得到的将是空终止。如果您的字符串恰好占用了 string . 在这种情况下,请致电 .c_str() 意志力 一串 为了将日期重新分配到一个新的更大的缓冲区,其中包含足够的空间来添加 '\0' 最后。

    无论如何,您当然不应该删除返回的指针。 一串 会处理好的。

        4
  •  1
  •   Wuggy    16 年前

    std::string.c_str()返回指向以nul结尾的字符串的指针。实际的字符数组仍归std::string对象所有,只要满足以下条件,它就有效:

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

    由字符串对象本身来分配和释放返回给您的以nul结尾的char数组。

    可以始终将以nul结尾的字符串用作非nul结尾的字符串。毕竟,NTS只是一个非NTS,在结尾处有一个额外的零。只要字符串按照函数的预期正确终止,它就永远不会看到“多余”的nul。:)