2011-01-21 2 views
0

나는 vector<vector<Person*>*>*라는 그룹이에 충돌하는 (예, 나는 shared_ptr에 대해 알고,하지만 난이 상황에서 사용할 수 없음), 다른 하나는에, 어쨌든 partialGroups 벡터 소멸자의 원인이 프로그램은 C++

라고 나는 다음이 가진 메소드를 호출

// Deal with remaining partial teams 
vector<Person*> *unsortable; 
groups->push_back(unsortable); 
// Remaining people 
for(unsigned int i = 0; i < people.size(); i++) { 
    unsortable->push_back(people[i]); 
} 
// Remaining partial groups 
for(unsigned int i = 0; i < partialGroups.size();i++) { 
    for(unsigned int j = 0; j < partialGroups[i]->size(); j++) { 
     unsortable->push_back(partialGroups[i]->at(j)); 
    } 
    delete partialGroups[i]; 
} 

return groups; 

: 나는 여전히 유효 할 원하기 때문에 방법의 끝이 나는, 내부 벡터의 모두 삭제 아니라 사람 자체, 그래서 여기에 코드의 끝은 코드 줄 :

vector<vector<Person*>*> *currentMatch = sort(*people); 

GDB를 모두 반환 그룹으로 돌릴 수 있습니다. 성명서를 작성하고 데이터 구조를 살펴 보더라도 괜찮습니다. 그러나 메서드에서 빠져 나와서 프로그램이 충돌하고 스택 추적에서 벡터 소멸자 자체가 충돌하고 있음을 보여줍니다.

이 문제의 원인은 무엇입니까? 내부 벡터는 사람을 가리키는 포인터이기 때문에 Person 소멸자에 문제가 없어야합니다. 또한 삭제 라인을 제거해도 차이가 발생하지 않습니다. (예, 메모리 누출이 있지만 문제를 진단하는 데 도움이되었을 것입니다.)

감사합니다.

편집 : 또한, 오류는이 코드가 정확 경우 초기화되지 않은 포인터, unsortable와 모든 종류의 것들을하고있는 SIGABRT

+2

'std :: vector >이 아닌 이유는 무엇입니까? 벡터에서 벡터에 대한 포인터를 가질 이유가 없습니다. –

+4

당신은 정말 포인터 dontcha를 사랑하니? –

+1

문제가있는 완벽한 테스트 케이스를 게시 할 수 있습니까? 코드 길이를 줄이십시오. 그러나 이해할 수없는 문제 만 표시하고 컴파일러 오류와 같이 이해할 수있는 문제가 없는지 확인하십시오. 방망이 바로 위에, 위의 코드는 UB가 uninitialized unsortable을 사용하고 있습니다. –

답변

6

입니다. 메소드에서 빠져 나간다는 것이 놀랍습니다.

+0

이런 젠장, 와우 난 너무 오래 있었어, 정말 고마워, 그게 문제라고 생각해. 고마워. –