C++中vector.resize未增大向量大小且出现段错误如何解决?
问题根因
- 核心问题1:
Rent::get_floor函数返回的是Floor值类型,每次调用都会生成原楼层对象的临时拷贝,你对临时对象做的set_room_count、set_room_amount等修改,完全不会作用到m_rent内部存储的真实Floor对象上,临时对象修改完成后就会销毁,下次调用get_floor拿到的还是未修改的原对象,因此会出现set_room_count不生效、get_room_count输出0的问题。后续你调用get_room_amount(0)时,真实Floor对象的paid_per_rooms还是空vector,访问下标0直接越界,触发段错误。 - 次要问题2:
Floor::set_room_amount逻辑错误,你传入了下标参数index,但调用push_back是把值追加到vector末尾,完全没用到index参数,就算前面的修改生效,这种写法也会让vector长度超出预期,极易触发越界。你之前尝试的paid_per_rooms[index] = amount本身逻辑是对的,只是受第一个问题影响没有生效而已。 - 冗余逻辑:
Rent::set_floor_count里的reserve调用是多余的,resize本身就会处理内存分配、元素初始化的逻辑,不需要提前调用reserve。
修复方案
第一步:修改Rent::get_floor返回值为引用类型
将返回值从值类型Floor改为引用类型Floor&,这样调用get_floor拿到的就是内部真实对象的引用,所有修改会直接作用到原对象上,可按需补充const重载用于只读场景:
// 可写版本 Floor& Rent::get_floor(int index){ return this->paid_per_floors[index]; } // 只读版本可选补充 const Floor& Rent::get_floor(int index) const { return this->paid_per_floors[index]; }
第二步:修正Floor::set_room_amount逻辑
删掉push_back写法,用下标赋值即可,可加边界判断提升健壮性:
void Floor::set_room_amount(int index, int amount){ if (index >= 0 && index < this->paid_per_rooms.size()) { this->paid_per_rooms[index] = amount; } }
修改完成后重新编译运行,stdout line3会输出预期的5,stdout line4也不会触发段错误。
内容的提问来源于stack exchange,提问作者aashakil50
相关产品推荐
相关产品推荐

