为什么Delete会出错?见下代码。求讨论!

铭毅天下
大数据领域优质创作者
博客专家认证
2012-09-02 11:37:11

class CBase
{
public:
CBase() { cout << "CBase" << endl; }
virtual ~CBase() { cout << "~CBase" << endl;}
};

class CDerived : public CBase
{
public:
CDerived() { cout << "CDerived" << endl; }
~CDerived() { cout << "~CDerived" << endl; }
};

int main()
{
CBase base;
CBase* pBase = new CBase;
pBase = &base;
delete pBase; //运行时报错!
}
...全文
242 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
铭毅天下 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

程序有两个问题:
1.内存泄露,new出来的没delete;
2.两次析构;base不是new出来,在生命周期结束(也就是你函数结束的时候)会自动释放,你主动调用delete将其析构,系统在函数结束时又会对其析构,所以才会报错。而且报错的地方应该是程序退出时,而不应该是你说的那个地方。
[/Quote]

分析很到位,谢谢!
铭毅天下 2012-09-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

pBase指向了栈区内存,那是系统管理的空间,不能用delete释放的。
你程序在堆区new的空间最后没有被释放,造成了内存泄露。
最好不要随便把申请到堆区空间的指针指向别处,至少也要有一个指针指向申请的空间。以便最后释放的是自己申请的那块内存。
[/Quote]


//如何释放其在堆取new的空间呢?以下修正后正解。

int main()
{
CBase base;
CBase* pBase = new CBase;
CBase* pBase2 = pBase; //至少也要有一个指针指向申请的空间
pBase = &base;
delete pBase2; //以便最后释放的是自己申请的那块内存。

} //运行时不再报错!

xspace_time 2012-09-04
  • 打赏
  • 举报
回复
class CBase
{
public:
CBase() { cout << "CBase" << endl; }
virtual ~CBase() { cout << "~CBase" << endl;}
};

class CDerived : public CBase
{
public:
CDerived() { cout << "CDerived" << endl; }
~CDerived() { cout << "~CDerived" << endl; }
};

int main()
{
CBase base;
CBase* pBase = new CBase;
delete pBase; //运行时不报错!
pBase = &base;
}
上面已经说得不是很明白了
fwdddd 2012-09-03
  • 打赏
  • 举报
回复
两次释放同一个地址,程序崩溃。
c_340705108 2012-09-03
  • 打赏
  • 举报
回复
楼上正解
jmppok 2012-09-03
  • 打赏
  • 举报
回复
程序有两个问题:
1.内存泄露,new出来的没delete;
2.两次析构;base不是new出来,在生命周期结束(也就是你函数结束的时候)会自动释放,你主动调用delete将其析构,系统在函数结束时又会对其析构,所以才会报错。而且报错的地方应该是程序退出时,而不应该是你说的那个地方。
yuanlianxi03 2012-09-03
  • 打赏
  • 举报
回复
pBase变量的所占的内存是不能释放的,因为他是栈上的内存,是系统分配的,程序员不能释放,而pBase所指向的内存是你自己在堆上分配的,是可以释放的;delete只能释放new分配的内存
EmberSpirit 2012-09-03
  • 打赏
  • 举报
回复
pBase指向了栈区内存,那是系统管理的空间,不能用delete释放的。
你程序在堆区new的空间最后没有被释放,造成了内存泄露。
最好不要随便把申请到堆区空间的指针指向别处,至少也要有一个指针指向申请的空间。以便最后释放的是自己申请的那块内存。
铭毅天下 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

两次释放同一个地址,程序崩溃。
[/Quote]

主要是因为pBase = &base;即pBase与&base都是地址,且地址相等指向同一块区域,导致在析构时报错吗?
羽飞 2012-09-02
  • 打赏
  • 举报
回复
最简单的解释,栈上的内存不是new出来的,内存管理器中没有这个指针的记录

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧