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()
的建议特别有用。谢谢!