2012-10-31 44 views
5

我有一個項目,我正在使用std貼圖進行一些奇怪的行爲。因#pragma pack錯誤導致的內存損壞 - std地圖損壞 - 插入時崩潰

我有我自己定義的typedef映射,它將字符串映射到自定義類型的指針。在將第一個對添加到地圖後,應用程序隨時崩潰,超出地圖範圍。

很多亂搞後,我改變了地圖和它移動到我的應用程序第一個呼叫,它仍然崩潰。我不知道會發生什麼事。任何幫助,將不勝感激。

這裏是當前崩潰的代碼。

LoggerPtr syslogger(Logger::getLogger("CISInterface")); 

int main(int argc, char *argv[]) 
{ 
    typedef std::map<string, string> MyMapDef; 
    MyMapDef tmpString; 
    tmpString.insert(MyMapDef::value_type("0000", "d")); 
    tmpString.insert(MyMapDef::value_type("1111", "d")); //Crashes here. 
    tmpString.insert(MyMapDef::value_type("2222", "d")); 

// std::string configFile; 
// int c; 
// if(argc < 2) 
// { 
//  //Must have c option 
//  std::cout << "Usage -c configFileName" << std::endl; 
//  exit(EXIT_FAILURE); 
// } 
//Rest of main commented out. 
... 

這裏是堆棧跟蹤 -

CISInterface Debug [C/C++ Application] 
    gdb/mi (10/31/12 6:02 PM) (Suspended) 
     Thread [1] (Suspended: Signal 'SIGSEGV' received. Description: Segmentation fault.) 
      6 std::basic_string<char, std::char_traits<char>, std::allocator<char> >::compare(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const() 0x00000032fd49c416  
      5 std::operator< <char, std::char_traits<char>, std::allocator<char> >() basic_string.h:2317 0x0000000000417ec7 
      4 std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::operator() stl_function.h:230 0x000000000041706f 
      3 std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_insert_unique() stl_tree.h:1170 0x0000000000415d00  
      2 std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::insert() stl_map.h:500 0x00000000004150eb 
      1 main() CISInterface.cpp:29 0x000000000041916d 
gdb (10/31/12 6:02 PM) 
/home/cillian/workspace/CISInterface/Debug/CISInterface (10/31/12 6:02 PM) 

其他方面我應該看的是什麼引起的問題。它可以在我連接的庫中嗎?我創建了第二個項目,只有這些代碼鏈接到相同的庫(但沒有任何調用它們的代碼),並且它不會崩潰。

+3

如果您發佈的代碼確實是所有的代碼,那麼只** **可以導致你的問題的事情是由'LoggerPtr syslogger(記錄儀:: getLogger(「CISInterface」))堆損壞;'。 'main'中的代碼是正確的。嘗試發表評論,看看你是否仍然崩潰。 – john

+1

我剛剛複製你的'main()'並在這裏運行它(Ubuntu 12.04,gcc 4.6.3)。到目前爲止沒有問題。該錯誤必須在其他地方。 –

+0

哪一條是第29行? –

回答

3

問題解決了。

以爲我會在這裏添加它,以避免其他人做同樣的事情。

我慢慢刪除了我的項目中的文件,試圖找到有問題的文件。我一直認爲它必須是一個頭文件中定義的東西,導致問題(如靜態)。這花了很長時間,但我想我已經找到了它。我有一個頭文件,它定義了許多結構。這些序列化到電線,所以我有他們1字節使用#pragma pack(推),我放在文件的頂部和#pragma pack(彈出)在底部對齊。但是,我在第一個#pragma定義之後添加了一些#include語句,這意味着這些包括被錯誤地對齊並導致了一些不確定的行爲。感謝所有看過的人。應該可能使用屬性語法,我不會有問題。有效代碼在下面是爲了完整。

#pragma pack (push) 
#pragma pack (1) 

#include <string> //Wrong place for includes! 
#include <Units.h> 

typedef struct 
{ 
.... 
} 
#pragma pack (pop) 

謝謝大家誰看了一下最初的問題。

+1

user1787720,將自己的答案標記爲答案。 :) – Yakk

+0

忘記'#pragma pack(pop)'也可能導致類似的效果 –