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


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

  • 相关阅读:
    android工程混淆和反编译
    php+列出目录文件
    php+大文件管理
    支持粘贴图片的富文本编辑器
    web上传整个文件夹
    文件夹管理
    断点续传
    超大文件上传方案
    ueditor+word粘贴上传
    java+大文件上传
  • 原文地址:https://www.cnblogs.com/lexus/p/2857538.html
Copyright © 2020-2023  润新知