标签:
#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,至此,我们应该就明白为什么会发生这样奇怪的情况了。那么到这里,问题又来了,为什么会出现这么个诡异的现象呢?
标签:
原文地址:http://www.cnblogs.com/wystan/p/4551768.html