2016-10-16 2 views
-3

저는 C++을 처음 접했을뿐입니다. 몇 주 전에 방금 배웠습니다. 개별적으로 동일한 참조를 가리키는 2 개의 포인터에 문제가 있습니다. * workingOn을 재 할당하려고하면 * 사용자가 쓰레기로 변합니다. 여기 두 포인터가 동일한 참조

코드입니다 :

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(); 

가져 오기 권한이 관리자, 고객, 유지 보수를 포함 0,1,2을 반환 할 수 있습니다 열거입니다.

* 사용자는 관리자 또는 고객이 될 수 있습니다. * workingOn은 현재 작업하고있는 사람입니다.

코드는 더 나은 설계되었다하는의 수 (고객으로) 자신을 수 ...하지만 난 다형성 너무 불편했고 수있는 I 사용자가 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(); 
     } 
    } 

} 내 헤더에

: 여기

는 사용자의 초기화이다 공공 : 표준 : : 벡터 s_customer; 벡터 s_container의 크기가 변경되는 경우 //이 프로그램

Interface UI; 
std::string user_loggedIn; 
Customer *user = nullptr; 
Customer *workingOn = nullptr; 
+1

_std :: cout_는 디자인 *에서 유용한 *을 반환하지 않습니다. 코드 샘플이 너무 많아 세부 정보가 너무 많아서 문제가 해결되지 않아 유용하다고 제안 할 수 있습니다. [최소한의 완전하고 검증 가능한 예제를 만드는 방법]을 참조하십시오. – agg3l

+0

기본적으로 권한은 0,1,2를 반환 할 수있는 enum입니다. s_customer는 벡터 배열이고 workingOn과 user는 모두 고객 포인터입니다. – Muffin

+1

_I_ 가능성이 무엇인지 짐작할 수 있습니다. 아무도 다른 사람들과 똑같이 말할 수 없습니다. 유용한 답변을 받으려면 질문을 조정하십시오. 댓글에는 없지만 원래 질문을 수정하고 서식을 지정합니다. 커뮤니티는 나중에 필요에 따라 커뮤니티를 조정하는 데 도움이되지만 질문을 이해하는 것이 명확하지 않은 경우 – agg3l

답변

2

난 당신이 user 때문에 쓰레기 값을 받고 의심의 모든 고객을 개최하는 것은 더 이상 유효하지 않습니다. s_container.push_back(...)으로 전화를 걸었을 때 용량이 충분하지 않으면 내부적으로 벡터는 realloc()으로 전화를 걸며 새 용량에 맞춰 다음 사용 가능한 인접 메모리 블록으로 메모리 위치를 변경할 가능성이 큽니다.

이터레이터 (또는 해당 메모리에 대한 참조)가 벡터에서 무효화 될 때이 table을 살펴보십시오.

Invalidation Table

당신이이 문제를 해결하기 위해 할 수있는 몇 가지가있다. 첫 번째 옵션은 포인터 자체가 아니라 사용자에게 인덱스를 저장하는 것입니다. 이렇게하면 올바른 메모리 위치에서 오프셋되기 때문에 메모리가 유효한지 확인할 수 있습니다.

user-> 

는 또 다른 옵션 요소를 추가 한 후 포인터/반복자의 유효성을 보장하는 용기를 사용하는 것입니다

s_container[ userIndex ]. 

된다. STL에서 가장 일반적인 것은 std::deque입니다. 다음은 deque 용 invalidation table입니다.

관련 문제