最近遇到了一个assign 崩溃的问题, 代码的话 其实就是去assign,莫名其妙就崩溃,是在一个自动化测试的时候发生的,可能手动测试的时候不会发现!

猜了一下里面的assign的逻辑,基本是这样的:每次去assign的时候 string内部会去申请内存,然后把数据放进去,第二次的话 会首先将之前的先delete掉,再重新new一遍!

那样的话 多线程就有问题了,因为这个东西的话 本身不是线程安全的,测试代码如下,希望可以帮助到遇到这个问题的同学!~

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include<string>
std::string g_str;void* test(void*)
{while(1){std::string str  ="123456";g_str.assign(str);}
}int main()
{pthread_t t1;pthread_create(&t1, NULL, test, NULL); usleep(50);while(1){std::string str  ="123456";g_str.assign(str);}return 0;
}

堆栈如下

Program received signal SIGABRT, Aborted.
0x00007ffff70141d7 in raise () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.17-157.el7_3.2.x86_64 libgcc-4.8.5-11.el7.x86_64 libstdc++-4.8.5-11.el7.x86_64
(gdb) thread apply all btThread 2 (Thread 0x7ffff6fde700 (LWP 2545)):
#0  0x00007ffff705c284 in _int_malloc () from /lib64/libc.so.6
#1  0x00007ffff705efbc in malloc () from /lib64/libc.so.6
#2  0x00007ffff79170cd in operator new(unsigned long) () from /lib64/libstdc++.so.6
#3  0x00007ffff7975c79 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) () from /lib64/libstdc++.so.6
#4  0x00007ffff7977531 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag) () from /lib64/libstdc++.so.6
#5  0x00007ffff7977968 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&) () from /lib64/libstdc++.so.6
#6  0x0000000000400b90 in test () at test1.cpp:12
#7  0x00007ffff7bc8dc5 in start_thread () from /lib64/libpthread.so.0
#8  0x00007ffff70d676d in clone () from /lib64/libc.so.6Thread 1 (Thread 0x7ffff7fe9740 (LWP 2541)):
#0  0x00007ffff70141d7 in raise () from /lib64/libc.so.6
#1  0x00007ffff70158c8 in abort () from /lib64/libc.so.6
#2  0x00007ffff7053f07 in __libc_message () from /lib64/libc.so.6
#3  0x00007ffff705b503 in _int_free () from /lib64/libc.so.6
#4  0x00007ffff797704e in std::string::assign(std::string const&) () from /lib64/libstdc++.so.6
#5  0x00000000004009bd in main () at test1.cpp:28
(gdb) 

其实已经很清楚了!

std::string::assign 崩溃的问题相关推荐

  1. 【C++标准库】std::string用法指南源码剖析

    文章目录 1.ASCII码 (1)计算机如何表达字符 2.C 语言中的字符类型 char (1)思想:char 即整数 (3)C 语言帮手函数 (4)C语言中的字符串 (4)C 语言转义符 3.C++ ...

  2. C++/C++11中std::string用法汇总

    C++/C++11中std::string是个模板类,它是一个标准库.使用string类型必须首先包含<string>头文件.作为标准库的一部分,string定义在命名空间std中. st ...

  3. 将整个ASCII文件读入C ++ std :: string [重复]

    本文翻译自:Read whole ASCII file into C++ std::string [duplicate] This question already has an answer her ...

  4. 如何将std :: string转换为const char *或char *?

    如何将<code>std::string转换为char*或const char* ? #1楼 看看这个: string str1("stackoverflow"); c ...

  5. std::string用法总结

    c++stdstring 在平常工作中经常用到了string类,本人记忆了不好用到了的时候经常要去查询.在网上摘抄一下总结一下,为以后的查询方便: string类的构造函数: string(const ...

  6. std::string 用法

    string类的构造函数: string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初始化 string类的字符操作: cons ...

  7. std::string的拷贝赋值研究

    说明:以下涉及的std::string的源代码摘自4.8.2版本. 结论:std::string的拷贝复制是基于引用计数的浅拷贝,因此它们指向相同的数据地址. // std::string类定义 ty ...

  8. std::string删除首字符

    查了下std::string的使用手册,才知道string删除字符只有erase成员方法,但是这个方法提供了3个重载函数,如下: string& erase ( size_t pos = 0, ...

  9. C++ 标准程序库std::string 详解

    现在一般不再使用传统的char*而选用C++标准程序库中的string类,是因为string标准程序和char*比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个类出现,集成的操作函数足以完 ...

最新文章

  1. Windows 2008
  2. 通过简单的Word Count讲解MapReduce原理以及Java实现
  3. JavaFX UI控件教程(十三)之Table View
  4. [jQuery] jQuery和Zepto的区别?各自的使用场景?
  5. vscode生成vue模板快捷键_VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法...
  6. require()与 require_once()、 include与include_once()
  7. c语言函数的参数是结构变量,何去运用结构体变量和结构的变量的指针作为函数的参数...
  8. jQuery弹出窗口完整代码
  9. POJ 3311 Hie with the Pie (状压DP)
  10. IDEA创建maven聚合项目多模块项目并在Tomcat启动图解详细教程
  11. 【DIOCP-DEMO说明】所有演示DEMO的简要说明
  12. matlab在脚本中用函数,matlab中脚本和函数的怎么调用
  13. Java日志体系---JUL源码解析
  14. 企业流程再造(BPR)
  15. c语言lst文件,Keil C51 之LST文件
  16. 主机插耳机没声音问题
  17. 抖音、快手打起来了,互联网大佬集体内卷?
  18. python实现FFT,IFFT
  19. MP FILTRI FMP0394BAA6M25NP01
  20. 点餐小程序原型模板-书亦烧仙草

热门文章

  1. java shirofilter_Spring项目集成ShiroFilter简单实现权限管理
  2. OpenCV中重映射
  3. 基于网络索引树的异常轨迹检测算法
  4. 方差分析中的“元”和“因素”是什么?
  5. python每隔几秒执行一次_Python设置程序等待时间
  6. thinkphp跨库操作代码实例
  7. c mysql 双主复制_mysql双主复制总结
  8. f分布表完整图a=0.05_2019年05月16日,沪深A股股票分析
  9. 最大尺寸分辨率_未来就在眼前!全球最大尺寸、最高分辨率硅基OLED显示屏在肥点亮...
  10. ios10中禁止Safari浏览器用户缩放页面