2012-02-19 3 views
1

다음 문제를 해결하기 위해 머리를 쓰려고합니다. 개체에 대한 const 참조를 받아들이는 다음 함수가 있습니다. 내가 뭘하고 싶은지, 객체 구성 요소에 대한 포인터가 참조하고있다. 그러나 storage.push_back()을 호출하면 객체 구성 요소가 참조됩니다 (구성원 데이터가 손상됨).포인터가있는 C++ 벡터 푸시 백

저는 동일한 객체 구성 요소에 대한 포인터를 참조하려고하는데 객체를 전혀 변경하지 않습니다 .

void InputSystem::RegisterInputAcceptingEntity(const PlayerInputComponent &component) { 

    auto *cpy = &component; 

    std::vector<const PlayerInputComponent*> storage; 
    storage.push_back(cpy); 
} 

왜 위 코드가 객체 구성 요소를 참조하여 변경됩니까?

수정 : 나는 상수 포인터를 포함하도록 벡터를 편집했습니다.

정확히 무슨 일이 벌어지고 있는지 보여주는 몇 가지 스크린 샷입니다. 여기 피 호출 수신자에서 참조로 전달 될 인수를 검사하면 input_component 멤버가 손상되지 않았 음을 알 수 있습니다. 이미지 enter image description here URL : http://i.imgur.com/lKpRm.png

그러나, 두 번째 이미지의 바로 위 말했다 방법으로 스테핑 후 :

enter image description here URL 이미지 : http://i.imgur.com/x0Vdn.png

내가 인상을 봤는데 const 참조를 지나면 함수 내부/외부에서 오브젝트가 달라지지 않아야합니다. const 참조를 전달하면 왜 객체가 전혀 변경되지 않는지 나는 알 수 없습니다.

+4

데이터 손상 문제는 호출자가 가장 많이 발생합니다. 그러나이 코드는'const_cast'를 남용합니다. 왜 인수는'const'입니까? –

+0

'Vector '를 가지고 있거나 constity 요구 사항을 다시 생각해 봐야합니다. 또한'&'에'std :: addressof (component)'를 선호합니다. –

+0

부패는 push_back() (vs2011 베타의 디버깅 도구) 시점에서만 발생합니다. 객체가 참조 대상이었던 객체 구성 요소를 변경하지 못하도록 const 객체가 만들어졌습니다. – Short

답변

1

먼저 코드를 valgrind으로 실행하고 손상이 실제로 발생하는 곳을 확인하십시오. 포인터를 배열에 밀어 넣으면 가리키는 데이터에 아무런 변화가 없어야합니다.