zoukankan      html  css  js  c++  java
  • 从一个小程序明白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,至此,我们应该就明白为什么会发生这样奇怪的情况了。那么到这里,问题又来了,为什么会出现这么个诡异的现象呢?

  • 相关阅读:
    xiong_6博客迁址
    调用百度地图获取地理位置
    fastadmin 接口开发注意事项
    fastadmin下拉选择框数据生成
    fastadmin 模型篇
    fastadmin跨数据库配置模型
    Git学习笔记#2-创建版本库与提交文件
    Git学习笔记#1-基本概念
    科目一知识点汇总
    Mysql学习笔记#6-约束
  • 原文地址:https://www.cnblogs.com/wystan/p/4551768.html
Copyright © 2011-2022 走看看