C++ OOP抽象类ContBancar调用setBal触发Access violation writing location错误
错误根因
Access violation writing location报错的核心原因是空智能指针解引用:
你在Banca::citire_conturi的读取逻辑中执行顺序错误:
- 调用
temp.setCodUs(cod)设置完账户类型编码后,直接调用temp.setContBal(balanta)尝试写入余额 - 此时
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); }
额外优化建议
- 给余额读写方法增加空指针校验,避免后续再出现同类非法访问问题:
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("无法读取未初始化的银行账户余额"); }
- 补充
ContBancar类getBal方法的const修饰,和UserAccount的getContBalconst属性匹配:
double getBal() const { return _balanta; }
内容的提问来源于stack exchange,提问作者Dragoș-George Gherasim
相关产品推荐
相关产品推荐

