2010-05-30 79 views
1

爲什麼這個代碼停止與段故障:的std ::地圖插入分段故障

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

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

,但是當我把「的std ::地圖inToOut;」只是 「inToOut.insert」 之前,它工作得很好:

class MapFile 
{ 
public: 
    /* ... */ 
}; 

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


好的。謝謝你們,看來我已經解決了這個問題,這要感謝你的幫助。

的問題是在我已經致電LoadMapFile代碼的一部分:

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

    MapFile::LoadMapFile(filename); 
} 

應該是:

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

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

調試器告訴你什麼? – 2010-05-30 21:00:48

回答

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; 
} 

嘗試一步一步的調試或發佈你的整個代碼在這裏,因爲這有它沒有問題。

另外,是的。如果您試圖在不鎖定的情況下同時從不同線程執行該操作,則可能會導致段錯誤。

+0

好的。謝謝。我會看看它。代碼有點太長了,無法粘貼到這裏。 – 2010-05-30 21:15:22

+0

是的。你是對的。我有MapFile :: LoadMapFile(文件名);而不是MapFile a; a.LoadMapFile();看來我的問題現在已經解決了。 – 2010-05-30 21:37:53

1

也許您的應用程序是多線程的,你是不是鎖定插入到map。第二個變體不與其他線程共享map

2

很可能你有一個緩衝區溢出或一個壞指針,導致你在你的類的成員中垃圾地圖。當你有一個自動變量的類,它是在內存中的其他地方,你的原始錯誤是摧毀了一些其他的內存。

你應該在內存調試器下運行你的代碼。如果你在Linux上,我會推薦Valgrind

1

你可能在一個已經被刪除的對象上調用了成員函數。

例如。

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

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

會產生您描述的錯誤。第二種情況不會發生,因爲您在任何時候都不提取this指針。

編輯:也許不是,在輸入,輸出變量是成員數據的情況下,那麼我的答案將是不正確的。

1

這種問題的其他原因可能是使用具有自定義比較器和/或分配器的映射,並且不相應地初始化映射,這可能會在任意隨機點產生分段錯誤,即:第一個插入可以完美工作,但在第二種情況下,當調用比較函數時,可能存在分段錯誤。