string :: c_str()是否允许在堆上分配任何东西?

Pil*_*lsy 11 c++ string

如果我需要在一个需要确保没有分配任何内容的情况下从一个NUL终止的char阵列中获取std::string,那么使用它是否安全c_str?例如,如果我在析构函数中并且我想将一些数据从一个复制string到预先分配的固定大小的缓冲区中,我可以使用c_str并确保它不会抛出任何东西吗?

Mic*_*urr 7

标准说调用c_str()可能会使引用,指针和引用的元素无效string,这意味着允许实际定位(21.3/5"类模板basic_string").

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


Tyl*_*nry 6

不,标准没有这样的保证.C++标准中唯一的保证是返回的值指向一个char数组,其内容与std::stringnul-terminator相同.

因此,符合标准的实现以除了C字符串以外的某种方式存储其内部表示,并在您调用时动态分配C字符串c_str,尽管我很确定没有广泛使用的STL实现实际上这样做.

现在,关于C++ 0x,我听说过(虽然我现在不知道为此找到文档),其中一个变化是要求std::string在连续存储上运行(类似的要求)已存在std::vector).因此,在这种情况下,你可以从访问的跨度&str[0]&str[0]+str.length()-1,好像它是一个C字符串不包含NUL终止符.