博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++踩坑记录(一)std::string的析构
阅读量:6077 次
发布时间:2019-06-20

本文共 968 字,大约阅读时间需要 3 分钟。

  hot3.png

越学C++越觉得坑有点大

之前写服务端程序有一个往消息队列里面推json的过程,然后发现推进去C#端取到的无论如何都是个空指针
简单复现一下Bug

string my_str1 = string("hello1");string my_str2 = string("hello2");c_char* point1 = my_str1.substr(2).data();//这里之所以写成c_char的原因是因为博客审核莫名其妙说我色情,其实是常量的意思。。。。c_char* point2 = my_str2.substr(2).data();cout << point1 << point2 << endl;

这样看起来输出是ello1ello2的输出,在我笔记本上面挺正常的,实际上我集成到服务器上面的时侯炸了,一直取到一组奇怪的字符串

跟踪调试了一早上(虽然写了3年C++工程,但是还是菜吧)。
原来在str1.substr(1)创建了一个临时对象存储str1的子串。data()函数获取了这个子串的内存指针。

执行到到了下一行的时候,存储str1子串的字符串对象被析构,msvc发现这是个临时对象,代码块还没结束的十好几就把内存析构掉,临时对象的内存被释放,同时str2.substr(1),这个时候新的临时变量被注册到刚才str1.substr(1)被析构掉的内存地址上面,此时再去调用data(),拿到了ptr1同一个地址的指针,此时内存的数据变更为s2的子串,然后压到消息队里面的数据穿就乱了,当我把程序增加一个临时string去接收上面产生的子串的时候,问题就会解决了

string str1 = string("string1");string str2 = string("string2");string t_str1 = str1.substr(1);string t_str2 = str2.substr(1);const char* ptr1 = t_str1.data();const char* ptr2 = t_str2.data();cout << ptr1 << ptr2 << endl;

此时输出正常

转载于:https://my.oschina.net/VenusV/blog/3030000

你可能感兴趣的文章
三行代码解决 winform 重绘闪烁,窗口重绘效率低下的问题
查看>>
go中利用hmset替换hset来提高redis的存取效率及并发goroutine可能遇到的问题
查看>>
谈iphone电话短信增强工具kuaidail软件的实现
查看>>
正则表达式-切割
查看>>
文艺青年会看这本《迷局》么?
查看>>
時間API用詞梳理
查看>>
小 X 与机器人 (betago)
查看>>
TextView tv01=(TextView)this.findViewById(R.id.TextView01); tv01.setText("设置文字背景色");...
查看>>
U-Boot-1.1.6顶层目录MKCONFIG脚本配置文件详细分析
查看>>
剑指offer——面试题5:替换空格
查看>>
hdu Virtual Friends
查看>>
go学习笔记(03)-基本语法-数据类型
查看>>
2018/12/06 L1-026 I Love GPLT Java
查看>>
安卓-05-使用Java设置UI--实验02-使用Java实现UI设置
查看>>
ny509 因子和阶乘
查看>>
Silverlight suddenly stopped working(Silverlight突然不能正常工作)
查看>>
使用offsetof对结构体指针偏移操作
查看>>
让windows下服务断开后自动重启(两种方法)
查看>>
android 获取 imei号码
查看>>
SPSS—回归—曲线估计方程案例解析(转)
查看>>