从一个小程序明白new和delete的奇特现象

#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,运行:

 1 #include <iostream>
 2 #include <list>
 3 using namespace std;
 4
 5 class emp
 6 {
 7         protected:
 8         string name;
 9         public:
10         emp(){}
11         virtual ~emp(){}
12         virtual void print() = 0;
13
14 };
15
16 class empch:public emp
17 {
18
19         public:
20         empch(const string& str)
21         {
22                 name = str;
23         }
24         void print()
25         {
26                     cout<<name<<endl;
27         }
28
29 };
30
31 int main()
32 {
33         list<emp*> link;
34         emp* p=NULL;
35         string str = "nihao";
36
37         p=new empch(str);
38         link.push_back(p);
39         delete p;
40         p=NULL;
41
42         p=new empch(str);
43         link.push_back(p);
44         delete p;
45         p=NULL;
46
47         p=new empch(str);
48         link.push_back(p);
49     //    delete p;        //在此删除delete动作
50         p=NULL;
51
52         list<emp*>::iterator q = link.begin();
53
54         while(q!=link.end())
55         {
56                 (*q)->print();58                 q++;
59         }
60
61         return 0;
62 }

此时输出:

nihao
nihao
nihao

------------------
(program exited with code: 0)
Press return to continue

修改程序,将容器中保存的各个地址输出:

 1 #include <iostream>
 2 #include <list>
 3 using namespace std;
 4
 5 class emp
 6 {
 7         protected:
 8         string name;
 9         public:
10         emp(){}
11         virtual ~emp(){}
12         virtual void print() = 0;
13
14 };
15
16 class empch:public emp
17 {
18
19         public:
20         empch(const string& str)
21         {
22                 name = str;
23         }
24         void print()
25         {
26                     cout<<name<<endl;
27         }
28
29 };
30
31 int main()
32 {
33         list<emp*> link;
34         emp* p=NULL;
35         string str = "nihao";
36
37         p=new empch(str);
38         link.push_back(p);
39         delete p;
40         p=NULL;
41
42         p=new empch(str);
43         link.push_back(p);
44         delete p;
45         p=NULL;
46
47         p=new empch(str);
48         link.push_back(p);
49         p=NULL;
50
51         list<emp*>::iterator q = link.begin();
52
53         while(q!=link.end())
54         {
55                 (*q)->print();
56                 cout<<*q<<endl;
57                 q++;
58         }
59
60         return 0;
61 }

输出如下:

nihao
0x9ff4020
nihao
0x9ff4020
nihao
0x9ff4020

------------------
(program exited with code: 0)
Press return to continue

此时发现每个地址都是0x9ff4020,至此,我们应该就明白为什么会发生这样奇怪的情况了。那么到这里,问题又来了,为什么会出现这么个诡异的现象呢?

时间: 2024-11-25 19:45:02

从一个小程序明白new和delete的奇特现象的相关文章

关于链表的一个小程序

关于链表的一个小程序: /**************************链表*****************************//* 具备功能 *//* 链表按元素位置插入 *//* 链表按元素位置删除 *//* 链表全表遍历 *//* 链表整表创建(头插法) *//* 链表整表创建(尾插法) *//* 链表整表删除 *//**************************链表*****************************/ #include<stdio.h>#in

原创观点:还在认为企业或个人只能申请一个小程序吗?

今天第一次体验了整个小程序注册流程,使用的是我自己的这个简单的教程(个人无appid如何进行申请开发者权限,简单操作步骤),教程虽然是我的,我自己却没有真的实践过,真是误人子弟,自己也不一定能知道:今天亲自测试了一下:首先走完邮箱验证: 验证完毕后,开始进入信息登录,这里,有一些关键信息,是本文观点的主要支撑: 请输入管理员的身份证号码,一个身份证号码只能注册5个小程序. 然后填写完毕后,到了第二个关键点: 为了验证你的身份,请用绑定了管理员本人银行卡的微信扫描二维码. 这个点,透露了两个信息,

先做一个“小程序”——关于微信应用号的六大猜想

先做一个“小程序”——关于微信应用号的六大猜想 9月 21 日,苦等了9个多月的时间,应用号终于与我们见面了,命名为「小程序」. 01 为什么推出小程序? 考虑到小程序对整个APP市场的影响,毫无疑问会对现有的APP生态带来一定的冲击.但是,之所以推出小程序,最直接的原因可能是为了构建和扩充微信生态链,让微信更具开放性. 如我们所知,目前微信公众号分为三类: • 服务号,连接人和商品,目前很多电商企业,以及在微信端提供产品和服务的企业都用服务号. • 订阅号,微信官方的定位是阅读,连接人和资讯的

Python 练习册,每天一个小程序

Python 练习册,每天一个小程序 说明: Python 练习册,每天一个小程序.注:将 Python 换成其他语言,大多数题目也适用 不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 点此链接,会看到每个题目的代码, 欢迎大家 Pull Request 出题目,贴代码(Gist.Blog皆可):-) 本文本文由@史江歌([email protected] QQ:499065469)根据互联网资料收集整理而成,感谢互联网,感谢各位的分享.鸣谢!本文会不断更新. Talk is chea

Python练习册,每天一个小程序

Python练习册,每天一个小程序 精选评论关注该公众号可参与评论 写评论 加载中 以上评论由公众帐号筛选后显示 Python练习册,每天一个小程序 提交 我的评论 已评论 Python练习册,每天一个小程序 2014-12-15 程序猿 说明: ●Python 练习册,每天一个小程序.注:将 Python 换成其他语言,大多数题目也试用 ●不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 ●欢迎大家 Pull Request 出题目,贴代码(Gist.Blog皆可):-) ●访问链接h

一个小程序能够反映的能力

程序员小郑刚步入岗位,但是在公司编码过程中没有受到专业的编码规范的培训,编写出来的程序虽然能够完成指定的功能但是比较不统一,偶尔会别出心裁的设计出自己的简化方法.老王这是从事了软件编码十多年了,现在都快到不惑的年龄了,在软件行业摸爬滚打十多年从事过多个行业,接触过不同公司的编码的规范,在软件代码编写中有独到的认识. 有一天有一个小功能的改动,由于这是一个非常重要的基础系统的功能变动,所以即便是一个小的功能变动公司上上下下都投入了非常高的重视程度.这天老王找到小郑告诉了需要修改这个系统并详细的描述

Python 练习冊,每天一个小程序

Python 练习冊,每天一个小程序 说明: Github 原文地址: 点击打开链接 Python 练习冊.每天一个小程序.注:将 Python 换成其它语言,大多数题目也试用 不会出现诸如「打印九九乘法表」.「打印水仙花」之类的题目 欢迎大家 Pull Request 出题目.贴代码(Gist.Blog皆可):-) Talk is cheap. Show me the code.--Linus Torvalds 第 0000 题:将你的 QQ 头像(或者微博头像)右上角加上红色的数字.类似于微

mono for Android 环境配置(环境搭建+破解方法+运行一个小程序)

一.准备工作:下载相关软件工具,为搭建环境做准备. 哎!百度网盘无法分享,根据名称下载. 二.首先安装 jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008 这里选择安装jdk6,网上看到一篇文章说jdk7及以上,mono还没有支持,但是那篇文字一年前写的,目前 支不支持,不清楚.这里保险起见,安装jdk6,mono是支持的.    注意环境变量的配置,这里不详细描述.主要配置java_home,path,class_path. 三.安装mono-2.1

c++学习笔记---02---从一个小程序说起

从一个小程序说起 这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系. 问题探索 问题:对一个整型数组求和. 要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务. 赶紧的:大家一起动手! 参考: #include <stdio.h> int addArray( int array[], int n ); int main() { int data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int size = sizeof(data) /