2010-05-30 16 views
1

이유는 무엇입니까 분할 결함이 코드 중지 :표준 : :지도 삽입 세그먼트 오류

class MapFile 
{ 
public: 
    /* ... */ 
    std::map <unsigned int, unsigned int> inToOut; 
}; 

bool MapFile::LoadMapFile(const wxString& fileName) 
{ 
    /* ... */ 
    inToOut.insert(std::make_pair(input,output)); 
} 

하지만 난 둘 때 "표준 : :지도 inToOut을;" 그냥 "inToOut.insert"전에 그냥 잘 작동합니다 :

?


확인. 고마워요, 당신의 도움으로이 문제를 해결 한 것 같습니다.

void WizardProductPage::OnTestButtonMapFile(wxCommandEvent& event) 
{ 
    wxString filename; 
    filename = locMapFile->GetValue(); 

    MapFile mapFile; 
    mapFile.LoadMapFile(filename); 
} 
+0

디버거에서 알려주는 것은 무엇입니까? –

답변

3

다른 문제가 있다고 생각합니다. 다음 코드는 확인 작업이 그것에 아무런 문제가 없기 때문에

class MapFile 
{ 
public: 
    std::map <unsigned int, unsigned int> inToOut; 
    void LoadMapFile(); 
}; 

void MapFile::LoadMapFile() 
{ 
    inToOut.insert(std::make_pair(1, 1)); 
} 

int main() { 
    MapFile a; 
    a.LoadMapFile(); 

    return 0; 
} 

시도 단계별 디버깅하거나, 여기에 전체 코드를 게시 할 수 있습니다.

예. 잠금없이 다른 스레드에서 해당 작업을 동시에 수행하려는 경우 segfault가 발생할 수 있습니다.

+0

확인. 감사. 나는 그것을 들여다 볼 것이다. 코드가 너무 길어 여기에 붙여 넣을 수 없습니다. –

+0

예. 당신이 옳았.MapFile :: LoadMapFile (파일 이름); MapFile 대신 a; a.LoadMapFile(); 내 문제가 해결 된 것 같습니다. –

1

어쩌면 응용 프로그램이 멀티 스레드하고 당신이하지 않은 :

void WizardProductPage::OnTestButtonMapFile(wxCommandEvent& event) 
{ 
    wxString filename; 
    filename = locMapFile->GetValue(); 

    MapFile::LoadMapFile(filename); 
} 

가되어야한다

문제는 내가 LoadMapFile를 호출했던 코드의 일부였다 map에 삽입을 잠급니다. 두 번째 변형은 map을 다른 스레드와 공유하지 않습니다.

2

버퍼 오버플로가 있거나 포인터가 클래스의 구성원 인 경우 휴지통으로 만들었던 불량 포인터 일 가능성이 큽니다. 클래스에 자동 변수가 있으면 메모리에있는 다른 곳에서 원래 버그가 다른 메모리 조각을 버리고 있습니다.

메모리 디버거에서 코드를 실행해야합니다. 리눅스를 사용하고 있다면 추천하겠습니다. Valgrind

1

삭제 된 객체에서 멤버 함수를 호출했을 가능성이 있습니다.

예 :

MapFile *p; 
{ 
    MapFile a; 
    p = &a; 
} 

p->LoadMapFile("test.map"); 

설명 된 오류가 발생합니다. 두 번째 경우는 언제든지 포인터를 역 참조하지 않기 때문에 발생하지 않습니다.

편집 : 아마도 입력, 출력 변수가 구성원 데이터 인 경우 내 대답이 정확하지 않을 수 있습니다.

1

다른 종류의 문제는 사용자 지정 비교기 및/또는 할당자를 사용하는지도를 사용하는 것이고 그에 따라지도를 초기화하지 않아 임의의 지점에서 세분화 오류가 발생할 수 있습니다. 즉 첫 번째 삽입물은 완벽하게 작동하지만 두 번째에는 compare 함수가 호출 될 때 세그멘테이션 오류가 발생할 수 있습니다.