一个使用STL::string时遇到的诡异bug
2013-03-05 16:58
295 查看
事情大致是这样的: 代码中用到一个局部string对象. 异常的是, 我还没给他赋值, 它的c_str()中已经有一些数据了.
下面的代码模拟了这种情况
输出结果:
s is
s is aaaaaaaaaa
很难想像, 没有栈溢出发生, 但是栈中的对象发生了变化. 在调试后有了发现: 所有以
导致其它地方也被修改.
其实这并不是stl设计者的错误,
所以使用string应当注意: 1. 获取c_str()前, 先判断它是不是空; 2. 不要随便修改const对象.
stl冰山下的东西太多, 除非认真读过stl源代码, 否则按文档规矩的使用才是上策.
作者: ani_di
版本所有, 转载需保留此链接 blog.csdn.net/ani_di
下面的代码模拟了这种情况
#include <iostream> #include <string> using namespace std; void test() { string s; memset((char*)s.c_str(), 'a', 10); } int main() { test(); string s; cout << "s is " << s << endl; printf("s is %s\n", s.c_str()); }
输出结果:
s is
s is aaaaaaaaaa
很难想像, 没有栈溢出发生, 但是栈中的对象发生了变化. 在调试后有了发现: 所有以
string s创建的对象, 其内部指针都指向同一位置. 这个位置是一个空的内存块. 所以
test()错误的对这个地址做了修改,
导致其它地方也被修改.
其实这并不是stl设计者的错误,
string::c_str()返回的是const char*, 并不可以修改. 输出1是正确的, 说明库本身是做了一定的防御编程.
所以使用string应当注意: 1. 获取c_str()前, 先判断它是不是空; 2. 不要随便修改const对象.
stl冰山下的东西太多, 除非认真读过stl源代码, 否则按文档规矩的使用才是上策.
作者: ani_di
版本所有, 转载需保留此链接 blog.csdn.net/ani_di
相关文章推荐
- 关于使用symfony2开发时遇到的一个诡异的bug
- 使用bind与引用遇到的一个很诡异的bug
- java string遇到的一个奇葩bug
- 在使用mybaitis传参数的时候,仅传入一个类型为String的参数所遇到的问题
- KindEditor使用过程中遇到的一个诡异的问题:form放在table中就失效
- 今天遇到一个关于STL中排序的问题, 怀疑是sort的bug!
- TabLayout使用的时候会遇到的一个bug
- Hive中LIKE查询使用通配符'%'的一个BUG--当转义符'\'遇到通配符'%'或'_'
- 使用AFNetworking框架遇到的一个经典bug的解决方案
- 使用 $(function(){}) 时遇到的一个小bug及解决方法
- Hive中LIKE查询使用通配符'%'的一个BUG--当转义符'\'遇到通配符'%'或'_'
- 使用WebDriver的过程中遇到的一个Bug
- iOS开发笔记之三十一——日历NSCaledar使用过程中遇到的一个苹果系统bug
- C++ 在使用CHttpFile进行http通信的时候遇到了一个Bug
- 使用AFNetworking框架遇到的一个经典bug的解决方案
- aix使用g++编译时一个stl string的问题
- Spring MVC在方法参数中使用@ModelAttribute中遇到的一个bug
- Android使用EditText遇到的一个bug
- ISE使用过程中遇到的一个诡异问题
- 遇到的一个诡异bug