2011-01-11 9 views
0

std::vectorsstd::mapsstd::shared_ptrs으로 만들려고하지만 데이터를 잃는 습관이있는 것 같습니다. 즉, std::shared_ptrs을 입력하면 그 중 일부는 해당 데이터를 삭제합니다.벡터 std :: shared_ptr 데이터 손실

특히 std::vector에 푸시 될 첫 번째 std::shared_ptr이 삭제됩니다. 원래 std::shared_ptr이 범위를 벗어날 때까지 을 std::vector으로 밀어 넣으면 참조 카운트를 증가시켜야하므로 혼란 스럽습니다. 맞습니까? 어떤 다른 std::shared_ptrs도 삭제 된 것 같지 않지만이 문제가 해결 될 때까지는 반복을 통해 값을 검사 할 때까지 확인할 수 없습니다.

내가 충분히 자신을 설명하지 않은 경우 사과드립니다. 나는이 사이트에 여전히 적응 중이다.

편집 : Here은 두 가지 관련 클래스의 코드입니다. 문제는로드 멤버 함수에 있어야합니다. 파일 파서이기 때문에 크기가 커서 문제가있는 곳을 알 수는 없습니다. 값은 List의 경우 std::vector<std::shared_ptr<NBT::Tag::Base>>이고 Compound의 경우 std::map<std::string, std::shared_ptr<NBT::Tag::Base>> 인 멤버 변수입니다.

+2

코드 샘플을 게시 할 수 있습니까? 내가 boost :: shared_ptr로 묘사 한 것을 모방하려했으나 올바르게 동작하는 것 같다. – Dawson

+0

몇 가지 코드를 게시 할 수 있습니까? 자신이하는 일을 정확하게 보지 않고서는 무엇이 잘못 될지 알기가 어렵습니다. – JaredC

+0

죄송합니다. 지금 게시하겠습니다. 10 개의 클래스와 하나의 기본 클래스가 있지만 관련 클래스를 게시합니다. – OniLink

답변

2

valgrind을 통해 프로그램을 실행하여 segfault의 원본을 찾습니다.

+0

: 왜? –

+0

"사용 valgrind"대답이 아닙니다. – nwp

2

당신은 shared_ptr을 쓸모 없게 만들 수 없으며 서로 구성해야합니다. 그렇지 않으면 shared_ptr을 소유하고 있다고 생각하며 범위를 벗어날 때 개체를 삭제합니다. 객체에서 직접 shared_ptr을 생성하려면 enable_shared_from_this<Type>에서 상속해야합니다. 나는 당신의 코드를 쉽게 읽을 수는 없다. (거기에는 많은 코드가있다.)하지만, 당신의 증상은 당신이 그들을 오해하고있는 것처럼 들린다.

+0

그래서 새 문장에서 std :: shared_ptr을 만들면 작동하지 않을까요? 왜냐하면 나는 새로운 문장으로부터 첫 번째 shared_ptr을 만들고 나머지는 그 shared_ptr로부터 복사되기 때문이다. – OniLink

+0

좋아요, 일부 디버깅을 수행했는데 그게 아니라는 것을 알았습니다. std :: shared_ptrs가 유일한 소유자라고 생각하는 문제는 아닌 것 같습니다.use_count를 삭제할 수있는 여러 위치에서 사용했습니다 (일반적으로 shared_ptr이 범위를 벗어날 때). 항상 문제가 아니어야하므로 소유자가 둘 이상이었습니다. – OniLink

+0

@OniLink : 이상하게도, 내가 가진 유일한 생각이었습니다. downvoter에 의해 드라이브에 – Puppy