缓冲区溢出是否发生在C++字符串中?

Jaz*_*azz 4 c++ string buffer-overflow

这与C++中的字符串有关.我很长时间没有接触过C/C++; 事实上,大约7年前,我只在大学的第一年用这些语言编程.

在C中保存字符串我必须创建字符数组(无论是静态的还是动态的,都不需要考虑).这意味着我需要提前猜出数组将包含的字符串的大小.我在C++中应用了相同的方法.我知道有一个std :: string类但我从来没有使用它.

我的问题是,因为我们从未在std :: string类中声明数组/字符串的大小,所以在写入时会发生缓冲区溢出.我的意思是,在C中,如果数组的大小是10并且我在控制台上键入了超过10个字符,那么额外的数据将被写入到与数组相邻的其他对象的内存位置.使用cin对象时,std :: string中是否会发生类似的事情.

使用std :: string时,我是否必须在C++之前猜测字符串的大小?

好!谢谢大家.这个页面上没有一个正确的答案(提供了很多不同的解释),所以我没有选择任何一个这样的答案.我很满意第一个5.小心!

dir*_*tly 8

取决于您用来访问string对象的成员,是的.所以,例如,如果你使用reference operator[](size_type pos)where pos > size(),是的,你会的.


Oli*_*rth 6

假设标准库实现中没有错误,没有.A std::string总是管理自己的记忆.

当然,除非您破坏提供的访问器方法std::string,并执行以下操作:

std::string str = "foo";
char *p = (char *)str.c_str();
strcpy(p, "blah");
Run Code Online (Sandbox Code Playgroud)

这里没有保护,并且正在调用未定义的行为.

  • 没有强制转换,至少编译器会检测到类型不匹配.修改`const charT*c_str()const;`返回的指针是UB.这是一个要求明确的`c_str()`:`要求:程序不应改变存储在字符数组中的任何值. (2认同)

ibi*_*bid 1

假设提供的库std::string已正确编写,则不会通过向对象添加字符而导致缓冲区溢出std::string

当然,库中出现错误也并非不可能。