[英]std::map insert segmentation fault
為什么此代碼會因分段錯誤而停止:
class MapFile
{
public:
/* ... */
std::map <unsigned int, unsigned int> inToOut;
};
bool MapFile::LoadMapFile( const wxString& fileName )
{
/* ... */
inToOut.insert( std::make_pair(input,output) );
}
但當我把“std :: map 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 );
}
我想你的問題在別的地方。 以下代碼可以正常工作:
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;
}
嘗試逐步調試或在此處發布您的整個代碼,因為它沒有任何問題。
還有,是的。 如果您試圖在不鎖定的情況下同時從不同的線程執行該操作,則可能會導致段錯誤。
很可能你有一個緩沖區溢出或一個壞指針,當你是一個類的成員時,它會導致你刪除地圖。 當你有一個自動變量的類時,它就在內存中的其他地方,而你原來的bug就會破壞其他一些內存。
您應該在內存調試器下運行代碼。 如果你在Linux上,我會推薦Valgrind
這種問題的其他原因可能是使用帶有自定義比較器和/或分配器的映射而不是相應地初始化映射,這可能在任何隨機點產生分段錯誤,即:第一個插入可以完美地工作,但在第二個插入,當調用比較函數時,可能存在分段錯誤。
也許您的應用程序是多線程的,並且您沒有鎖定插入到map
。 第二個變體不與其他線程共享map
。
您可能已在已刪除的對象上調用成員函數。
例如。
MapFile *p;
{
MapFile a;
p = &a;
}
p->LoadMapFile("test.map");
會產生你描述的錯誤。 第二種情況不會,因為您不會在任何時候取消引用this
指針。
編輯:也許不是,如果輸入,輸出變量是成員數據,那么我的答案是不正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.