为什么我不应该使用std :: string.c_str()作为缓冲区?

时间:2013-02-21 22:40:58

标签: c++ stdstring

虽然这可能是一个愚蠢的问题,但我看到了一些关于你不应该这样做的事情,尽管它在C ++ 11中被允许,但我不明白为什么。谁能解释为什么会这样?

1 个答案:

答案 0 :(得分:6)

这是不允许的!

  

21.4.7 basic_string字符串操作[string.ops]

     

21.4.7.1 basic_string访问者[string.accessors]

const charT* c_str() const noexcept;
const charT* data() const noexcept;
     
      
  1. 返回:指针p,使得[0,size()]中每个i的p + i ==&运算符。
  2.   
  3. 复杂性:恒定时间。
  4.   
  5. 要求:程序不得更改存储在字符数组中的任何值。
  6.   

除此之外,您正在修改const char *的数据引用,通常表示const_cast<char*>。这不仅会导致未定义的行为,而且根据Herb Sutter const现在应该被解读为线程安全(see his talk about const and mutable)。

但是,正如已经陈述的那样,如果std::string str; &str[0]足够大,则使用str是安全的。只是不要使用.c_str().data()