浙江省高等学校教师教育理论培训

微信搜索“毛凌志岗前心得”小程序

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

string c_str 使用问题 | 一淘测试博客

代码示例: 
std::string local_str;
local_str = "abcd";
const char *p = local_str.c_str();
…
local_str.append(“efg”);
现象&后果: 

指针p不再指向local_str。
存在一个野指针,后果可大可小。

Bug分析: 

这是使用string的c_str()常犯的错误,由于c_str()返回的是一个常量指针,它所指向的地方是不会改变的。在没有改变local_str的值之前,指针p就是local_str的首地址,但当对local_str追加了一些值之后,因为append会先开辟一段新内存,然后再将原来的值拷贝过来,所以local_str的首地址已经是新的了,不再是原来p的指向。

正确代码: 
在将local_str.c_str()赋值在p之后,不能去改变local_str
Bug定位: 

code review

编程建议: 

注意最好使用strcpy()函数等来操作方法c_str()返回的指针。
比如:最好不要这样:
char* c;
string s="1234";
c = s.c_str();
c最后指向的内容是垃圾,因为s对象被析构,其内容被处理,同时因为s对象的析构是在对指针c完成赋值操作之后进行的,故此处并没有报错误
正确的用法是:
char c[20];
string s="1234";
strcpy(c,s.c_str());   
这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作。这样就不存在野指针的问题。

posted on 2013-01-12 13:08  lexus  阅读(250)  评论(0编辑  收藏  举报