You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:51:03