2010-07-09 5 views
3

않습니다 getMisc()에 액세스 할 수있는 개인 vector<itemPtr> 회원을 가진 inventory이라는 구성원이있는 개체 itemPtrtr1::shared_ptr<Item>의 typedef이고 getName()Item의 개인 std::string 구성원을 반환합니다.벡터 :: 앞 작품을 참조하지만, 벡터 :: 시작 내가 코드의이 비트를하지

기본적으로 client->inventory.getMisc()std::vector에 이릅니다. 첫 번째 요소에 대한 반복기를 얻으려고합니다.

문제는 네 번째 줄이 segfaults라는 것입니다. 분명히 가리키는 iterator 또는 shared_ptr 중 하나가 유효하지 않습니다. 첫 번째 cerr 문을 사용하여 벡터 자체가 유효한지 테스트하고 필요한대로 인쇄합니다. 그래서 생각합니다.

내가 잘못하고있는 것이 있습니까? 또는 이것을 디버깅하려면 어떻게해야할까요?

+2

"설명 조금"보다 코드를 제공 할 수 있습니다. 이 사이트의 사람들은 코드를 이해하고 그것이 의미하는 바를 잘 이해하고 있습니다. 영어 설명보다 훨씬 정확합니다. –

답변

12

정확히 getMisc의 서명은 무엇입니까?

실제로 std::vector<itemPtr>을 반환하는 경우 사본을 반환합니다. 이 경우 임시 복사가 front 실행이 끝날 때까지 파괴되지 않기 때문에 첫 번째 액세스 패턴이 (천천히) 작동합니다.이 때까지 itemPtr 자체가 임시로 복사됩니다. begin을 사용하여 반복기를 가져온 후에는 임시가 범위를 벗어나 파괴되어 방금 만든 반복기가 매달려 있기 때문에 두 번째 오류가 발생합니다.

+0

저는 이것이 훌륭한 심령 디버깅 비트라고 생각합니다. –

+0

@Walter : 좋은 캐치. –

+0

그래, 그것이 그것이 무엇을 반환합니다. 그 대신에 무엇을해야합니까? – Max

1

여러분이 이것을 디버깅하려면 어떻게해야합니까?

front()이 무엇을 반환하는지와 (*it)이 무엇이 다른지 확인하려면 코드를 실행하십시오.

+0

나는 이것을 시도했지만 gdb로 변수를 잘 검사 할 수 없다. 'p client-> inventory.getMisc(). front()'을 실행하면 gdb는 '인벤토리 이름의 멤버 또는 메소드가 없습니다'라고 말합니다. 'p * it'을 시도 할 때'shared_ptr '을 보유하고 있음을 알 수 있습니다. 'p ** it'을 시도 할 때 gdb는 '당신이 연산자 *에 전달하려고 한 인수 중 하나가 함수가 원하는 것으로 변환 될 수 없다'고 말합니다. – Max

0

벡터가 비어 있지 않습니까? frontbegin은 약간 다르게 동작 할 수 있으며 front은 순수한 기회로 작동 할 수 있습니다. 반복기 자체에서 추가 검사를 수행하면 seg 오류가 발생할 수 있습니다.