运行 我的程序时读取访问冲突

Read access violation when running my program

我正在用 C++ 创建一个简单的银行系统来测试我的知识,因为我是初学者。 我在将数据写入私有 class 时遇到问题,在互联网上四处查看后,我想出了一个我认为可行但行不通的解决方案。 当我完成“创建用户”部分时抛出一个异常,上面写着“异常抛出:读访问 violation._Pnext 是 0x6 ”。我不确定这意味着什么,但我的猜测是它与 createuser 函数中的指针有关。 我希望我在这里的解释不会太含糊,但我完全不知道发生了什么。另外,欢迎批评指正。

#include <iostream>
#include <string>


void clearscreen();
int createuser();
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;
    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();
            break;
        case 2:
            std::cout << "\nThis option is not avalible yet!";
        case 3:
            exitprogram = true;
            break;
        }
    }
    


    return 0;
}


int createuser() {

    clearscreen();
    MyClass User;
    int* p = (int*)&User;
    std::string* i = (std::string*)&User;
    std::cout << "Please enter the correct information!\n" << "Username: ";
    std::string createusern;
    std::cin >> createusern;
    *i = createusern;
    std::cout << "\n Password: ";
    std::string createpasswordn;
    std::cin >> createpasswordn;
    *i = createpasswordn;
    std::cout << "\nDeposit Money: ";
    int insertmoney;
    std::cin >> insertmoney;
    *p = insertmoney;
    std::cout << "\n\n Congratz, You now have a bank accout! \n\n";
    clearscreen();
    return 0;
     
    
}

嗯,这绝对是错误的:

MyClass User;
int* p = (int*)&User;

MyClass 的对象不是 int,但您强制编译器设置指向它的指针。这是调用未定义的行为,这可能导致崩溃(如您所见)

std::string* i = (std::string*)&User;

...这里有同样的问题。 MyClass 的对象也不是 std::string,因此强制编译器将指向字符串的指针设置为指向它也没有意义。

我不知道你想在那里做什么,但使用 C 风格的转换强制指针指向不相关的类型绝对不是这样做的方法。

你的指针投射无处不在,而且肯定是“不寻常的”,而且对于你正在尝试做的事情来说是不正确的。

这一行 *i = createusern; 不正确,因为 i 没有指向字符串。它指向一个 User 对象。你真正想在这里做的是这样的

User.setUsername( createusern );

…你的其他人口尝试也是如此。这些元素有 setter 个函数,所以请使用它们。

您还应该记住,您的 User 对象是本地对象,不会在 createuser 函数结束后继续存在