从一个小程序明白new和delete的奇特现象
2015-06-04 14:32
519 查看
#include <iostream> #include <list> using namespace std; class emp { protected: string name; public: emp(){} virtual ~emp(){} virtual void print() = 0; }; class empch:public emp { public: empch(const string& str) { name = str; } void print() { cout<<name<<endl; } }; int main() { list<emp*> link; emp* p=NULL; string str = "nihao"; p=new empch(str); link.push_back(p); delete p; p=NULL; p=new empch(str); link.push_back(p); delete p; p=NULL; p=new empch(str); link.push_back(p); delete p; p=NULL; list<emp*>::iterator q = link.begin(); while(q!=link.end()) //执行到此会出现段错误 { (*q)->print(); q++; } return 0; }
删除最后一个p,运行:
#include <iostream> #include <list> using namespace std; class emp { protected: string name; public: emp(){} virtual ~emp(){} virtual void print() = 0; }; class empch:public emp { public: empch(const string& str) { name = str; } void print() { cout<<name<<endl; } }; int main() { list<emp*> link; emp* p=NULL; string str = "nihao"; p=new empch(str); link.push_back(p); delete p; p=NULL; p=new empch(str); link.push_back(p); delete p; p=NULL; p=new empch(str); link.push_back(p); // delete p; //在此删除delete动作 p=NULL; list<emp*>::iterator q = link.begin(); while(q!=link.end()) { (*q)->print(); q++; } return 0; }
此时输出:
nihao nihao nihao ------------------ (program exited with code: 0) Press return to continue
修改程序,将容器中保存的各个地址输出:
#include <iostream> #include <list> using namespace std; class emp { protected: string name; public: emp(){} virtual ~emp(){} virtual void print() = 0; }; class empch:public emp { public: empch(const string& str) { name = str; } void print() { cout<<name<<endl; } }; int main() { list<emp*> link; emp* p=NULL; string str = "nihao"; p=new empch(str); link.push_back(p); delete p; p=NULL; p=new empch(str); link.push_back(p); delete p; p=NULL; p=new empch(str); link.push_back(p); p=NULL; list<emp*>::iterator q = link.begin(); while(q!=link.end()) { (*q)->print(); cout<<*q<<endl; q++; } return 0; }
输出如下:
nihao 0x9ff4020 nihao 0x9ff4020 nihao 0x9ff4020 ------------------ (program exited with code: 0) Press return to continue
此时发现每个地址都是0x9ff4020,至此,我们应该就明白为什么会发生这样奇怪的情况了。那么到这里,问题又来了,为什么会出现这么个诡异的现象呢?
相关文章推荐
- Android 微信支付body参数不支持中文的问题
- 微信接入自定义开发
- 微信支付商户申请接入信息汇总【接入教程】
- 微信JS-SDK说明文档及常见问题处理
- 用微信分享又用微信支付问题
- 微信开发 没有认证过的服务号怎么办?微信提供了测试号(开通了认证过的服务号的功能)
- 仿微信摇一摇震动
- 用c#开发微信 (12) 微统计 - 阅读分享统计系统 2 业务逻辑实现
- iOS微信接入错误解决。~
- 如何精准化的做微信公众号运营?
- 微信仿制的时候常用的抓包工具
- 类似微信朋友圈动态的数字红点
- Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果 (转载)
- 公众微信认证方法与条件
- php微信支付测试开发(流程已通)
- 微信支付调用JSAPI缺少参数:timeStamp
- 微信JS SDK Demo
- PHP JS判断浏览器,微信浏览器
- C#开发微信公众平台教程
- iOS开发之微信支付