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

来源:互联网 发布:非遗文化知多少 编辑:程序博客网 时间: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就不用内存池,另外再分配,这时内存用完了也会很快释放,一样会导致崩溃。

 

最后好戏终于上演:

 

原创粉丝点击