从vector中删除指定Hero对象时程序崩溃的问题求助
搞定你的vector删除崩溃问题
嘿,我一眼就看到你代码里的问题了——迭代器失效是导致崩溃的罪魁祸首,还有几个小细节也得调整,咱们一步步来解决:
核心问题:erase后迭代器失效
你在killHero里的循环逻辑有个致命错误:当调用players.erase(iter)之后,当前的iter就变成无效的了,继续执行++iter会访问非法内存,这直接触发了崩溃。vector的erase操作会让被删元素之后的所有迭代器失效,绝对不能在erase后直接用原来的迭代器递增。
另外,你手动维护的vecorSize(还拼错了)完全没必要——vector自己会自动更新size,erase之后size会自动减1,手动改反而容易出问题。
修正后的killHero函数
直接给你改好的代码,注释里写清楚了逻辑:
void killHero(Hero* hero, vector<Hero*>& players) { auto iter = players.begin(); // 用while循环代替for,方便控制迭代器 while (iter != players.end()) { Hero* h = *iter; if (h->getName() == hero->getName()) { delete *iter; // 先释放堆内存 // erase返回下一个有效的迭代器,直接赋值给iter iter = players.erase(iter); } else { // 只有不删除元素的时候才递增迭代器 ++iter; } } }
额外的优化建议
- 用智能指针避免手动内存管理
如果你的项目用C++11或更高版本,强烈建议把vector<Hero*>换成vector<std::unique_ptr<Hero>>,这样根本不用手动调用delete,erase的时候会自动释放内存,彻底避免内存泄漏和释放错误:
// 初始化的时候 players.push_back(std::make_unique<Warrior>(nameOfwarrior)); // 删除的时候只需要erase,不用delete iter = players.erase(iter);
- 输入缓冲区的小坑
在createNewGame里用getline的时候,如果之前有过cin >>之类的输入操作,可能会残留换行符导致getline读取空字符串。如果遇到这种情况,记得在getline前加一句cin.ignore(numeric_limits<streamsize>::max(), '\n');(需要包含<limits>头文件)来清空缓冲区。
为啥原来的代码会崩?
当你erase之后,原来的iter指向的内存已经被vector回收了,这时候++iter相当于瞎指,访问了不该碰的内存,虽然程序退出码是0,但这只是未定义行为的一种表现——实际是内存访问错误导致的崩溃,只是状态码没体现出来而已。
内容的提问来源于stack exchange,提问作者Kumar Aldani
相关产品推荐
相关产品推荐

