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

C++开发简易银行系统运行时出现读取访问权限冲突报错

错误根因分析

你当前出现访问冲突报错的核心问题是createuser函数中对类对象地址的强制类型转换、直接操作内存的行为是完全错误的,属于C++中的未定义行为:

  • 你自定义的MyClass类的内存头部是std::string类型的Username成员,你把类对象地址强制转成int*后写入存款数值,相当于直接篡改了std::string内部的内存管理指针,等到函数结束User对象销毁时,std::string的析构函数会尝试访问已经被你篡改的非法地址(也就是报错里的0x6),直接触发内存访问冲突。
  • 你两次对*i赋值,也只会反复覆盖Username成员的内容,Password成员根本没有被正确赋值,完全达不到你想要的写入多个私有成员的效果。
  • 更关键的是:你已经在类的public区域写好了setUsername、setPassword、setMoney三个合法的 setter 接口,完全不需要通过非法的指针操作去修改私有成员。

修复后的代码

把createuser里的指针操作全部删掉,换成调用你自己写的setter方法即可:

#include <iostream>
#include <string>
#include <vector>

void clearscreen();
// 修改createuser参数,接收存储用户的容器引用
int createuser(std::vector<class MyClass>& userList);
class MyClass
{
private:
    std::string Username;
    std::string Password;
    int money = 0;

public:
    void setUsername(std::string x) {
        Username = x;
    }
    void setPassword(std::string y) {
        Password = y;
    }
    void setMoney(int z) {
        money = z;
    }
};
void clearscreen() {
    system("cls");
}

int main() {
    std::cout << "Welcome new User!\n" << std::endl;
    // 新增容器存储所有创建的用户
    std::vector<MyClass> allUsers;
    bool exitprogram = false;
    while (exitprogram == false)
    {
        std::cout << "The Options are:\n";
        std::cout << "1.  Create User\n" << "2.  Login\n" << "3.  Exit Program\n" << "\nEnter an option: ";
        int option = 0;
        std::cin >> option;
        switch (option)
        {
        case 1:
            createuser(allUsers);
            break;
        case 2:
            std::cout << "\nThis option is not avalible yet!";
            // 新增break,避免直接执行case3逻辑
            break;
        case 3:
            exitprogram = true;
            break;
        }
    }
    return 0;
}

int createuser(std::vector<MyClass>& userList) {
    clearscreen();
    MyClass User;
    std::cout << "Please enter the correct information!\n" << "Username: ";
    std::string createusern;
    std::cin >> createusern;
    User.setUsername(createusern);
    std::cout << "\n Password: ";
    std::string createpasswordn;
    std::cin >> createpasswordn;
    User.setPassword(createpasswordn);
    std::cout << "\nDeposit Money: ";
    int insertmoney;
    std::cin >> insertmoney;
    User.setMoney(insertmoney);
    // 把创建好的用户存入全局容器,后续登录可读取
    userList.push_back(User);
    std::cout << "\n\n Congratz, You now have a bank accout! \n\n";
    clearscreen();
    return 0;
}

其他优化建议

  • 类名MyClass语义不清晰,建议改成BankAccount或者User这类符合业务含义的名字。
  • clearscreen函数里的system("cls")是Windows平台特有的实现,如果需要跨平台运行可以加条件编译适配Linux/macOS的clear命令,个人练习使用无需调整。
  • 后续做登录功能时,还需要给MyClass补充对应的getter方法,用于读取用户名、密码做校验。

内容的提问来源于stack exchange,提问作者CPPNEWBIE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:15:07