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

C++ OOP抽象类ContBancar调用setBal触发Access violation writing location错误

错误根因

Access violation writing location报错的核心原因是空智能指针解引用:
你在Banca::citire_conturi的读取逻辑中执行顺序错误:

  1. 调用temp.setCodUs(cod)设置完账户类型编码后,直接调用temp.setContBal(balanta)尝试写入余额
  2. 此时UserAccount的std::shared_ptr<ContBancar> _cont成员还未初始化,是空指针,对空指针解引用写入内存直接触发访问违规。

修复方案

调整citire_conturi方法内的属性设置顺序,设置完账户类型编码后,先调用setContBancar()初始化_cont指针,再操作余额:

while (file >> cod >> nume >> balanta >> user >> pass)
{
    temp.setCodUs(cod);
    // 新增此行,根据编码初始化对应等级的银行账户实例
    temp.setContBancar();
    temp.setNume(nume);
    temp.setContBal(balanta);
    temp.setUser(user);
    temp.setPass(pass);
    vec.push_back(temp);
}

额外优化建议

  1. 给余额读写方法增加空指针校验,避免后续再出现同类非法访问问题:
void setContBal(double balanta) { 
    if(_cont) {
        _cont->setBal(balanta); 
    } else {
        throw std::runtime_error("无法给未初始化的银行账户设置余额");
    }
}
double getContBal() const { 
    if(_cont) {
        return _cont->getBal(); 
    }
    throw std::runtime_error("无法读取未初始化的银行账户余额");
}
  1. 补充ContBancar类getBal方法的const修饰,和UserAccount的getContBalconst属性匹配:
double getBal() const { return _balanta; }

内容的提问来源于stack exchange,提问作者Dragoș-George Gherasim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:36:00