c ++ char数组是否超出范围?

时间:2009-05-12 00:15:47

标签: c++ memory-management stl

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

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

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:8)

string.c_str()返回的char数组是nul终止的。如果tinyXML的函数需要一个非空终止的char *缓冲区,那么你可能会遇到一些意想不到的行为。

  

const char * c_str()const;

     

获取等效的C字符串

     

生成以null结尾的序列   字符(c-string)与之相同   content作为字符串对象和   将其作为指向数组的指针返回   字符。

     

终止空字符是   自动附加。

不,不需要发布。 String的析构函数为你做到了。

  

返回的数组指向   内部位置与所需   这个序列的存储空间   字符加上终止   null-character,但是这里的值   不应该修改数组   程序,只被授予保留   直到下一次打电话给a   非常数成员函数   字符串对象。

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

答案 2 :(得分:4)

另一方面,
如果您不需要将char指针设置为空终止,那么最好使用str.data()而不是str.c_str()。不同之处在于.data()并不认为你得到的东西将被终止。如果您的字符串恰好占用string分配的内部缓冲区的整个长度,这将非常有用。在这种情况下,调用.c_str()会强制string将日期重新分配给新的较大缓冲区,其中包含足够的空间以在最后添加'\0'

无论如何,当然你不应该删除返回的指针。 string会照顾到这一点。

答案 3 :(得分:1)

std :: string.c_str()返回指向nul终止字符串的指针。实际的字符数组仍然由std :: string对象拥有,只要它是有效的:

  1. std :: string对象有效,
  2. 不会对std :: string对象上的非const成员函数进行调用(即修改字符串会使之前指向的任何C样式字符串无效)。
  3. 由字符串对象本身来分配和释放它返回给你的nul终止的数组。

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