delete一个指针时出现问题,狂郁闷.

yndfcd 2004-09-25 03:23:35
Bubbles的声明如下:
vector< CBubble* > Bubbles;
有一般代码如下:
if( row == (Rows - 1) )
{//结束游戏
delete Current;
State = GAME_ENDED;
vector< CBubble* >::iterator itr = Bubbles.begin();
for( ; itr != Bubbles.end(); ++itr)
{
point2d pt;
CBubble* pB = *itr;
pB->GetPos( pt );
pB->Launch();
delete *itr;//这句有问题。
}
Bubbles.clear();
Game->Reset();
return;
}
如果将delete *itr;这句删除,则程序执行正常,加上这句的话,进行过程中非法退出,没有任何提示,各位高手看看,是什么问题?
...全文
217 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qkhmyi 2004-10-01
  • 打赏
  • 举报
回复
这段代码本身没有问题,而且去掉delete就没错,说明*itr也指向了一个合法的对象,最可能出问题的是CBubble类的析构函数,也可能是其它地方内存访问的错误,影响了这段代码的执行,有时候内存出错很奇怪,大可发挥你的想像力。。:)
Zark 2004-09-26
  • 打赏
  • 举报
回复
If you just want to delete the item pointed by itr in your list, your deleting is totally wrong, you may need to do as follows:

Bubbles的声明如下:
vector< CBubble* > Bubbles;
有一般代码如下:
if( row == (Rows - 1) )
{//结束游戏
delete Current;
State = GAME_ENDED;
vector< CBubble* >::iterator itr = Bubbles.begin();
for( ; itr != Bubbles.end();)
{
point2d pt;
CBubble* pB = *itr;
pB->GetPos( pt );
pB->Launch();
itr=Bubbles.erase(itr);
}
Bubbles.clear();
Game->Reset();
return;
}

Good luck.
yoboo_yb 2004-09-26
  • 打赏
  • 举报
回复
首先可以肯定的是:
通过delete *itr;语句,来释放itr所指vector< CBubble* > Bubbles;中的CBubble*指针所指的对象空间,这种方法正确,不会引起异常。

那么异常处在哪里?
在delete *iter;语句释放所指的CBubble对象空间时,会析构CBubble对象,CBubble对象析构时又会带来一系列的析够,因此,异常的位置就在这里,这一系列析构过程中!设置断点,好好跟踪。
oo 2004-09-25
  • 打赏
  • 举报
回复
建议楼主在CBubble的析构函数里设个断点,
看是不是里面有问题。
  • 打赏
  • 举报
回复
delete *itr;是可行的,问题在其他地方 ,如上面提到的有无数据。
langzi8818 2004-09-25
  • 打赏
  • 举报
回复
itr是个iterator,不应该delete.
我看的书上都没有delete iterator
made_in_ 2004-09-25
  • 打赏
  • 举报
回复
哦,你说把指针从容器中去掉吗?
应该用vector本身的函数,似乎用remove之类吧。查一下则可。
made_in_ 2004-09-25
  • 打赏
  • 举报
回复
我想你本来想delete的应该是pB吧?应该用delete pB。
itr是个iterator,不应该delete。而且你这种使用容器的方法和风格,也不符合标准。
  • 打赏
  • 举报
回复
就目前而言,没见到Bubbles中有东西,如果Bubbles本身无效,肯定不能进行。
oo 2004-09-25
  • 打赏
  • 举报
回复
delete *itr; 没问题,后面++itr也不会有问题
应该是别的地方的问题。
最好把CBubble的实现贴出来
yndfcd 2004-09-25
  • 打赏
  • 举报
回复
我的目的是要删除容器中的指针。不是要删除容器中的元素。

期待高手。
goodluckyxl 2004-09-25
  • 打赏
  • 举报
回复
问题应该就是楼上说的
for( ; itr != Bubbles.end(); )
{
point2d pt;
CBubble* pB = *itr;
pB->GetPos( pt );
pB->Launch();
CBubble* Temp = itr;
itr++;
delete Temp ;
}
试试

  • 打赏
  • 举报
回复
for( ; itr != Bubbles.end(); ++itr)
{
point2d pt;
CBubble* pB = *itr;
pB->GetPos( pt );
pB->Launch();
delete *itr;//这句有问题。
=====>delete *itr? 应该是delete itr;但这样又导致++irt出错,自己看着办
}
ylhyh 2004-09-25
  • 打赏
  • 举报
回复
itr是在什么时候生成的

64,649

社区成员

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

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