临时对象的隐蔽性与野指针不崩之谜
来源:互联网 发布:非遗文化知多少 编辑:程序博客网 时间:2024/05/22 04:59
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就不用内存池,另外再分配,这时内存用完了也会很快释放,一样会导致崩溃。
最后好戏终于上演:
- 临时对象的隐蔽性与野指针不崩之谜
- MFC返回的临时对象指针成因?
- MFC返回的临时对象指针成因?
- 不要返回c++临时对象的指针
- C++之临时对象的构造与析构
- 与临时对象的斗争
- C++中指针,引用与const,以及const中的临时量对象的探讨
- 软件工程之信息隐蔽与模块独立性
- 临时对象的构造与析构
- 与临时对象的斗争(上)
- 与临时对象的斗争(下)
- 与临时对象的斗争(上)
- 与临时对象的斗争(下)
- 与临时对象的斗争(下)
- 与临时对象的斗争(上)
- 临时对象的产生与运用
- vs2005 移植的问题(智能指针临时对象)
- C语言:空指针与不指向任何对象的指针的区别
- intel2011多线程编程大赛之一Game Of Life 最优寻址单线程
- ExtJs 处理复合主键 ID不唯一 数据缺失问题
- 汇编中的test和cmp指令[Z]
- Ubuntu 朗文不发音问题
- intel2011多线程编程大赛之一Game Of Life 最优寻址多线程
- 临时对象的隐蔽性与野指针不崩之谜
- print,cout比较
- ios新手到app store
- SQL语句大杂烩
- windows 图片打不开的 BUG
- 解決BufferedReade 中文乱码
- 省市数据--类的方式读取
- if/esle结构和if结构的趣题
- JBPM实践系列(一)---安装配置之jbpm-console(tomcat+mysql+jbpm)