运行 我的程序时读取访问冲突
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
函数结束后继续存在
我正在用 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
函数结束后继续存在