2012-10-31 18 views
5

私は、stdマップで奇妙な動作が発生しているところで作業しています。#pragma packエラーによるメモリ破損 - std map破損 - 挿入時にクラッシュする

カスタムタイプのポインタにマップされた独自のtypedefマップがありました。最初のペアをマップに追加した後、いつでもアプリケーションがクラッシュしました。

多くの混乱の後、マップをaに変更し、アプリケーションの最初の呼び出しに移動しましたが、それでもクラッシュします。私は何が起こっているのか分かりません。どんな助けもありがとう。

現時点ではクラッシュするコードです。

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) 

。私がリンクしている図書館にはありますか?私は、同じライブラリにリンクするコード行だけで2番目のプロジェクトを作成しましたが(しかし、それらに呼び出すコードはありません)、クラッシュしません。

+3

あなたが投稿しているコードは、すべてのコードが本当にあるならば、**のみ**あなたの問題を引き起こしている可能なことは 'LoggerPtrののsyslogger(ロガー::のgetLogger(「CISInterface」))によって引き起こされるヒープ破損であります;'。 'main'のコードは正しいです。その行をコメントアウトして、まだクラッシュするかどうか確認してください。 – john

+1

私はあなたの 'main()'をコピーしてここで走らせました(Ubuntu 12.04、gcc 4.6.3)。これまでのところ問題ありません。エラーは他の場所にある必要があります。 –

+0

どちらが29行ですか? –

答えて

3

問題を解決しました。

思考私はここでそれを他の誰もが同じことをするオフチャンスに追加します。

プロジェクト内のファイルをゆっくりと削除して、問題のファイルを見つけようとしました。私はそれが問題を引き起こしていたヘッダーファイルに定義された何か(静的なものなど)でなければならないと考えていました。それは長い時間がかかったが、私はそれを見つけたと思う。私はいくつかの構造体を定義するヘッダファイルを持っていました。これらはワイヤーにシリアル化されているので、#pragma pack(プッシュ)をファイルの先頭に、#pragma pack(ポップ)を一番下に置いて1バイトの位置を合わせました。しかし、最初の#pragma定義の後に2つの#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)'を忘れることによっても引き起こされる可能性があります。 –