簡體   English   中英

std :: map插入分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM