C++ string::c_str()是否允许在堆上分配任何内容?

C++ string::c_str()是否允许在堆上分配任何内容?,c++,string,C++,String,如果我需要从std::string中获取一个以NUL结尾的char数组,而我需要确保不会分配任何内容,那么使用c_str这样做安全吗?例如,如果我在析构函数中,我想将一些数据从字符串复制到预先分配的固定大小缓冲区中,我可以使用c_str并确保它不会抛出任何东西吗?不,标准没有这样的保证。在C++标准中唯一的保证是返回值指向 char 数组,其内容与 STD::String ,加上NUL终止符。 因此,以C字符串以外的方式存储其内部表示,并在调用C_str时动态分配C字符串,这将是符合标准的实现,

如果我需要从
std::string
中获取一个以NUL结尾的
char
数组,而我需要确保不会分配任何内容,那么使用
c_str
这样做安全吗?例如,如果我在析构函数中,我想将一些数据从
字符串
复制到预先分配的固定大小缓冲区中,我可以使用
c_str
并确保它不会抛出任何东西吗?

不,标准没有这样的保证。在C++标准中唯一的保证是返回值指向<代码> char 数组,其内容与<代码> STD::String ,加上NUL终止符。

因此,以C字符串以外的方式存储其内部表示,并在调用
C_str
时动态分配C字符串,这将是符合标准的实现,尽管我相当确定,没有广泛使用的STL实现真正做到这一点


现在,关于C++0x,我听说(尽管我目前找不到相关文档),其中一个变化是要求
std::string
在连续存储上操作(对于
std::vector
,已经存在类似的要求)。因此,在这种情况下,您可以从
&str[0]
通过
&str[0]+str.length()-1
访问span,就像它是一个没有nul终止符的C字符串一样。

标准规定,调用
C_str()
可能会使引用
字符串元素的引用、指针和interator无效,这意味着允许重新分配(21.3/5“类模板基本字符串”)


您可能只需要调用
string::copy()
来获取副本(如果需要,您需要自己添加空终止符)。

标准对此没有说明:

21.3.6[lib.strings.ops] 常数图*c_str()常数;1. 返回:指向初始值的指针 长度为size()的数组的元素+ 1,其第一个size()元素等于 系统的相应元素 由*this和谁控制的字符串 最后一个元素是空字符 由charT()指定

2要求:该程序不得 更改存储在中的任何值 数组。该计划也不应处理 返回值作为有效指针 任何后续调用 类的非常量成员函数 指定相同类型的基本_字符串 像这样的对象

可以。也就是说,Iv'e从未见过任何这样的实现

如果这是你的一个问题,你可能想考虑使用<代码>向量<代码>代替String < /C> >,并且做一些类似的事情:

vector<char> chars;
// ...
char* my_str = &chars[0];
矢量字符;
// ...
char*my_str=&chars[0];

这里的诀窍是知道何时以及如何处理以
'\0'
结尾的字符串。

标准几乎明确地说,当调用
c\u str
时,字符串可以分配内存。特别是,它说(§21.3/5):

引用基本字符串序列元素的引用、指针和迭代器可能会因以下使用该基本字符串对象而无效:
[…]
-调用data()和c_str()成员函数


它允许指针、引用和迭代器专门失效,以允许实现在调用
c_str

时重新分配用于存储字符串的内存。关于连续存储的要求,是的,c++0x N3126在
21.4.1/5
中说,“基本字符串对象中类似字符的对象应连续存储。”使用
string::copy()
的建议特别有用。谢谢!