2011-07-26 8 views
3

몇 달 동안 세그먼트 결함으로 고생하고 있습니다. 이제 도움을 청합니다. 분할 고장이 나는 GDB를 사용하여 다음과 같은 기능세그먼트 화 오류가 std :: map :: clear을 호출합니다.

void foo(..., std::map<MyClass*, double> & x) { 
if (!x.empty()) x.clear(); 
... 
} 

Class A { 
private: 
map<MyClass*, double> _N; 
public: 
void f(...) { 
foo(..., _N); 
... 
} 
}; 

//in main routine, the function is called in a loop 
A a; 
while(...) { 
a.f(...); 
} 

를 호출 할 때, 나는 분명히() 함수를 호출 라인에 오류 식은 나타납니다, 그것은이다 "더블 무료 또는 손상"오류 및 프로그램에 중단 C++/4.1.2/ext/new_allocator.h : 94 delete (__ P)를 호출하여 gnu 라이브러리 /lib64/libc.so.6에서 free()를 호출합니다. 그러나 맵의 요소가 new에 의해 할당되지 않았기 때문에 여전히 그것을 지우기 위해 free()를 호출하는 이유는 무엇입니까? 나는 정말로 당신의 의견에 감사 할 것입니다. 고맙습니다.

+0

오류는 다른 곳에 있어야합니다. 맵이 비 었는지 어쨌든 상관없이'clear()'를 호출 할 수 있습니다. 좀 더 앰비언트 코드를 보여주세요. –

+1

지도를 값으로 전달하면 프로그램의 의미가 틀리지 만 segf '는 어떻게됩니까? – 111111

+1

은 힙에 할당 된'foo'에 매개 변수로 전달되는 객체입니까? 그렇다면 이전에 이미 할당이 해제되었거나 다른 곳으로 이전되었을 가능성이 있습니까? –

답변

1

코드가 잘 보입니다. 적어도 당신이 제공 한 제한된 맥락에서. 보통 이런 문제가 생기면 valgrind memcheck 도구를 실행하여 처음 "삭제"된 장소를 찾습니다. 일단 당신이 그것을 알게되면,이 이슈들은 매우 간단하게 해결 될 수 있습니다.

2

맵이 다른 오브젝트에 의해 소유되었다고 가정하면 맵 소유 오브젝트가 클리어가 호출 될 때 이미 삭제되었다는 것이 의심 스럽습니다.

또한 밑줄과 대문자로 시작하는 이름은 구현을 위해 예약되어 있으므로 사용자는이를 사용할 수 없습니다.

관련 문제