代码示例: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_strBug定位: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()返回的是一个临时指针,不能对其进行操作。这样就不存在野指针的问题。