我有一个方法需要一个const char指针作为输入(不是null终止)。这是我在我的项目中使用的库(TinyXML)的要求。我从string.c_str()方法调用中获取此方法的输入。
是否需要删除此char指针?呼叫完成后,字符串立即超出范围;所以字符串应该用析构函数调用删除它,对吗?
答案 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 非常数成员函数 字符串对象。
答案 2 :(得分:4)
另一方面,
如果您不需要将char指针设置为空终止,那么最好使用str.data()
而不是str.c_str()
。不同之处在于.data()
并不认为你得到的东西将被终止。如果您的字符串恰好占用string
分配的内部缓冲区的整个长度,这将非常有用。在这种情况下,调用.c_str()
会强制string
将日期重新分配给新的较大缓冲区,其中包含足够的空间以在最后添加'\0'
。
无论如何,当然你不应该删除返回的指针。 string
会照顾到这一点。
答案 3 :(得分:1)
std :: string.c_str()返回指向nul终止字符串的指针。实际的字符数组仍然由std :: string对象拥有,只要它是有效的:
由字符串对象本身来分配和释放它返回给你的nul终止的数组。
您始终可以使用以空字符结尾的字符串作为非空终止字符串。毕竟,NTS只是一个非NTS,最后有一个额外的零。只要字符串按函数预期正确终止,它就永远不会看到“额外”的nul。 :)