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

问题描述 投票:1回答:4

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

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

c++ string memory-management stl
4个回答
8
投票

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

const char* c_str ( ) const;

获取等效的C字符串

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

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

否,不需要释放它。字符串的析构函数为您完成了此任务。

返回的数组指向一个 内部位置及所需 此序列的存储空间 字符及其结尾 空字符,但其中的值 数组不应在 程序,仅被保留 直到下一次调用 的非恒定成员函数 字符串对象。

Source


10
投票

不要删除从std :: string :: c_str获得的内存。字符串是造成这种情况的原因(而且完全有可能给您提供了指向其内部缓冲区的指针,因此,如果删除它,那将是一件坏事(tm))。


4
投票

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

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


1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.