我对C ++很陌生,几周前我刚刚学会了它。我有一个问题,2个指针分别指向相同的参考。当我尝试重新分配* workingOn然后* user变成垃圾。
以下是代码:
std::cout << static_cast<int> (user->getPermission()) << endl; // return 0
Customer c_temp(username, password, Permission::CUSTOMER);
s_customer.push_back(c_temp);
workingOn = &s_customer[s_customer.size() - 1];
std::cout << static_cast<int> (user->getPermission()) << endl; // return random memory
return customerLoggedInScreen();
get Permission是一个枚举,可以返回0,1,2,包括经理,客户,维护。
*用户可以是经理或客户 * workingOn是你正在做的人。哪个可能是你自己(作为顾客)
代码可以设计得更好......但我对多态和C ++不太满意
我正在尝试更改用户正在工作的人但之后我的指针变成垃圾记忆。最初,用户和工作人员是相同的。
以下是用户的初始化:
void Controller::login()
{
bool loggedIN = false;
using namespace std;
string input_password, input_username;
//call the login screen
UI.login(input_username, input_password);
/*
If the user is not a customer we will login as a manager
*/
for (int i = 0; i < s_customer.size(); ++i) {
user = &s_customer[i];
if (user->getUsername().compare(input_username) == 0 && user->getPassword().compare(input_password) == 0) {
user_loggedIn = input_username; // store the person who is logged in
if (user->getPermission() == Permission::CUSTOMER) {
workingOn= &s_customer[i];
return whatUItoDisplay();
}
return whatUItoDisplay();
}
}
}
在我的标题中我有: 上市: std :: vector s_customer; //这将保留程序中的所有客户
Interface UI;
std::string user_loggedIn;
Customer *user = nullptr;
Customer *workingOn = nullptr;
答案 0 :(得分:2)
我怀疑您收到垃圾值,因为如果调整了矢量user
,s_container
不再有效。当你调用s_container.push_back( ... )
并且没有足够的容量时,向量内部会调用realloc( )
,它有可能(很可能)将内存位置更改为下一个可用的连续内存块以适应新产能。
在向量中使迭代器(或对内存的任何引用)无效时,查看此table覆盖。
您可以采取一些措施来解决此问题。第一个选项是将索引存储到用户而不是指针本身。这可确保内存有效,因为它只是偏离正确的内存位置。
user->
变为
s_container[ userIndex ].
另一种选择是在添加元素后使用保证指针/迭代器有效性的容器。 STL中最常见的是std::deque
。这是deques的invalidation table。