两个指针同样参考

时间:2016-10-16 03:07:13

标签: c++ pointers

我对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;

1 个答案:

答案 0 :(得分:2)

我怀疑您收到垃圾值,因为如果调整了矢量users_container不再有效。当你调用s_container.push_back( ... )并且没有足够的容量时,向量内部会调用realloc( ),它有可能(很可能)将内存位置更改为下一个可用的连续内存块以适应新产能。

在向量中使迭代器(或对内存的任何引用)无效时,查看此table覆盖。

Invalidation Table

您可以采取一些措施来解决此问题。第一个选项是将索引存储到用户而不是指针本身。这可确保内存有效,因为它只是偏离正确的内存位置。

user->

变为

s_container[ userIndex ].

另一种选择是在添加元素后使用保证指针/迭代器有效性的容器。 STL中最常见的是std::deque。这是deques的invalidation table