none
std::string 访问越界的问题 RRS feed

  • 问题

  • 下面的代码:

    std::string path = "c:\\....\\a.txt";     //这个字符串长度为63(不带终结符)

    char* p = path.c_str();

    char c = p[64] ;                                // 访问越界,字符串长度为63,分配的内存空间也是63

    我单独运行这段代码未出现错误,但是在一个多线程程序(运行在winserver 2003)中崩溃,报错

    Access violation reading location 0x16383000

    0x16383000正是 &p[64], 请问是什么原因?谢谢!


    D
    • 已编辑 sailuer 2011年10月17日 3:23
    2011年10月17日 3:21

答案

全部回复

  • path.c_str();

    将直接返回指向std::string中的内存。不会进行拷贝,所以在另外一个进程使用p时,path可能已经被释放了。


    麻烦把正确答案设为解答。
    • 已标记为答案 Rob Pan 2011年10月20日 8:28
    • 取消答案标记 sailuer 2011年11月30日 8:54
    2011年10月17日 13:58
    版主
  • path 是局部变量啊,多线程怎么会影响它? 还是说std::string对内存做了优化,使得多线程共享底层数据吗?


    D
    2011年11月30日 8:55
  • 越界访问的结果是未定义。无论出错或没有出错都是正常的。
    • 已标记为答案 sailuer 2011年12月1日 1:32
    2011年11月30日 14:02
  • 线程安全是指通过string本身调用

    你通过自定义指针对其操作线程安全就要自己维护


    新浪微博http://weibo.com/xianglitian,欢迎围观
    2011年12月1日 1:24