关于new和 delete的使用,请教

wildn 2006-07-17 04:51:31
新手初学,请多指教。
按照书上的说法,new和delete一定要配对使用,我的理解在一个函数结束之前应该就调用delete 释放前面用new分配的内存,今天写的一个小程序去无法插入delete,无论放哪里都会在执行时报错,请大师们指教。
void cut(CRect rect)
{
int m,n,i,j;
RectNode* tmpNode;
m=rect.Width()/Wid;
n=rect.Height()/Hei;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
tmpNode=new RectNode;
tmpNode->rect=CRect(50+i*Wid,50+j*Hei,50+(i+1)*Wid,50+(j+1)*Hei);
cutNode->pNext=tmpNode;
cutNode=cutNode->pNext;
cutNode->pNext=NULL;
// delete tmpNode;
}
// delete tmpNode;
}
void fn()
{
...
cut(rect);
...
}
...全文
145 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanglin982712 2006-07-17
  • 打赏
  • 举报
回复
好像要用指针吧!
yifanernei 2006-07-17
  • 打赏
  • 举报
回复
既然所有的内存都已经保存在链表中去了,那这个临时变量就没有必要delete了
但要记得给它赋值为0
wildn 2006-07-17
  • 打赏
  • 举报
回复
我自己思考的结果:
程序中每一个用new 申请的堆内存都放到了链上,最后也没有多余的,所以内存没有泄漏,此时调用delete则会试图删除已经连接到链上的节点,所以会报错,也就是就这段程序而言,没必要用而且也不能用delete释放内存。
看来有些书上讲的太过绝对了。
不知对否,请大侠们指点。
wildn 2006-07-17
  • 打赏
  • 举报
回复
尝试了sakurako兄的办法,虽然运行是不会报错了,但节点也加不到链中了,就是代码中的链cutNode,全局变量。我就是怕出现内存泄漏才想用delete,但现在如果不用delete,程序运行良好,起码是表面上,但一加上,无论加哪儿,都要么报错,要么无法保存链的内容。现在先不考虑用vector,我想借这个问题把new和delete的问题搞清楚一点,还希望各位能在考虑一下。谢谢。
sakurako 2006-07-17
  • 打赏
  • 举报
回复
刚刚没看清代码~~~云云
cutNode->pNext=NULL; // 其实这里就是tmpNode,被你清空了
delete tmpNode; //此处在删就是 delete NULL 当然出错了

尝试改为
delete tmpNode;
cutNode->pNext=NULL;
sakurako 2006-07-17
  • 打赏
  • 举报
回复
那个RectNode是你自己定义的?你想组成链表啊
你声明了多个RectNode的对象:
1.假使你再循环里编删掉了,那么调用时在这个地址里已经不存在这个对象了,出错
2.在循环外删除,那么你也只删掉了一个而已,其他的对象仍存在,你却找不到了,会造成内存泄露
要么你在用完这些对象后循环删掉这些对象
要么就用vector
healer_kx 2006-07-17
  • 打赏
  • 举报
回复
用vector,别new 了,直接保存对象,而不是指针把,

64,641

社区成员

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

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