临时对象的隐蔽性与野指针不崩之谜

C++危险众所周知,项目中写代码写得天昏地暗的时候就容易踩陷阱。不是我故意耍小聪明,是进度的紧迫性和头脑的疲惫程度导致我写了这样的代码(代码经过简单处理,隐去复杂性以及不涉密。^_^):

 

char* tmpS=const_cast<char*>(string("hello").c_str());
cout<<tmpS<<endl;

 

输出什么?"hello"。多悲剧的回答,答案是仅有一个换行符而已。

因为临时对象string在调用流的时候析构掉了!(这个结论最后有代码验证。)

 

所以这种情况就正常了:

cout<<const_cast<char*>(string("hello").c_str())<<endl;

 

疑问在继续滋生。析构?那tmpS指向的内存没了,流调用的时候为何不会crash?对stl熟悉的朋友这时醒悟了,因为大部分string底层实现有用内存池。如果你模拟写一个string而不用内存池,保证连人带机一起在老板面前崩溃。况且,根据string的实现,如果缓冲用大了,string就不用内存池,另外再分配,这时内存用完了也会很快释放,一样会导致崩溃。

 

最后好戏终于上演:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值