如果我需要在一个需要确保没有分配任何内容的情况下从一个NUL终止的char
阵列中获取std::string
,那么使用它是否安全c_str
?例如,如果我在析构函数中并且我想将一些数据从一个复制string
到预先分配的固定大小的缓冲区中,我可以使用c_str
并确保它不会抛出任何东西吗?
标准说调用c_str()
可能会使引用,指针和引用的元素无效string
,这意味着允许实际定位(21.3/5"类模板basic_string").
您可能只想调用string::copy()
以获取副本(如果需要,您需要自己添加空终止符).
不,标准没有这样的保证.C++标准中唯一的保证是返回的值指向一个char
数组,其内容与std::string
nul-terminator相同.
因此,符合标准的实现以除了C字符串以外的某种方式存储其内部表示,并在您调用时动态分配C字符串c_str
,尽管我很确定没有广泛使用的STL实现实际上这样做.
现在,关于C++ 0x,我听说过(虽然我现在不知道为此找到文档),其中一个变化是要求std::string
在连续存储上运行(类似的要求)已存在std::vector
).因此,在这种情况下,你可以从访问的跨度&str[0]
过&str[0]+str.length()-1
,好像它是一个C字符串不包含NUL终止符.