您的位置:首页 > 移动开发 > 微信开发

从一个小程序明白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,至此,我们应该就明白为什么会发生这样奇怪的情况了。那么到这里,问题又来了,为什么会出现这么个诡异的现象呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: