类里面内存的申请和释放?

mountaineer 2003-05-02 11:02:27
在自己写的一个类Stack中,声明了一个指针数据成员
然后在constructor里,申请内存。
在destructor里,释放内存。
这是一个模板类。单独使用,我试了一下没问题。
但是,它是另一个模板类中PostOrder的一个数据成员,
现在问题是,PostOrder的对象作用域结束时,调用Stack的destructor
时,出现Debug assertion failed!
我看了一下,在destructor中释放的指针在整个过程中都没有变化。
如果把Stack类destructor中的释放语句删掉,让系统去处理,
就没上面的问题了。
高手赐教
...全文
118 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
pzh508 2003-05-07
  • 打赏
  • 举报
回复
今天收了一下e-mail,发现你已经传程序给我了,我现在已经帮你搞定了,
修改的方法:在函数template <class T>
void TraversePost( PostOrder< T > & PostIter )中将参数改成PostOrder< T > 的引用即可
原因:首先你的明白,按值传递参数,编译器是在函数的活动记录中拷贝了该对象(数据),
然后函数是使用该数据的拷贝而不是本身的内容,在这里导致的结果即是两个PostIter对象
指向了同一块内存(装载数据成员的内存),那么当TraversePost函数结束的时候,数据的拷贝对象PostIter调用析构函数释放掉stack指向的内存
然后,执行到主函数结束的时候,PostIter原对象又调用其析构函数想释放stack指向的内存,而stack指向的内存已经被释放,再释放它,肯定就出错了
而用引用作为参数,使用的就是原对象本身, 因而函数结束的时候,可以正确释放stack指向的内存(确保只释放一次)
MessiahLS 2003-05-02
  • 打赏
  • 举报
回复
我经常有遇到这样的问题,不过你所说的问题来看,在PostOrder中不应该new或delete指针,因为PostOrder作为Stack的一个成员,它应该使用Stack中new的指针,而应该让Stack去delete那片内存空间!不知道我是不是理解对了你的问题:)
pzh508 2003-05-02
  • 打赏
  • 举报
回复
我的,pzh508@cmmail.com
以前我也试过这种情况,想再体味一下,呵呵
mountaineer 2003-05-02
  • 打赏
  • 举报
回复
感兴趣的话,留下email,我发给你。多谢了
pzh508 2003-05-02
  • 打赏
  • 举报
回复
出现这种情况的有可能的原因之一是:该指针连续释放了,你仔细跟踪一下看看
而且注意:你去掉释放内存的语句,系统是不会去处理,即系统不会帮你释放申请的内存块
FiLng 2003-05-02
  • 打赏
  • 举报
回复
贴出代码!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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