6

私は、標準マップで奇妙な動作をしているプロジェクトに取り組んでいます。

文字列をカスタム型のポインターにマップする独自の 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 つ目のプロジェクトを作成しましたが (ただし、それらを呼び出すコードはありません)、クラッシュしません。

4

1 に答える 1

4

問題が解決しました。

他の誰かが同じことをする機会がなければ、ここに追加すると思いました。

プロジェクト内のファイルをゆっくりと削除して、問題のあるファイルを見つけようとしました。問題を引き起こしているヘッダーファイルで定義されたもの(静的など)に違いないと考えていました。長い時間がかかりましたが、私はそれを見つけたと思います。いくつかの構造体を定義するヘッダー ファイルがありました。これらはワイヤにシリアル化されるため、#pragma pack (push) をファイルの先頭に配置し、#pragma pack (pop) を末尾に使用して 1 バイトに揃えました。しかし、最初の #pragma 定義の後にいくつかの #include ステートメントを追加しました。これは、これらのインクルードが正しく配置されておらず、非決定的な動作を引き起こしていることを意味します。見てくれたみんなありがとう。おそらく属性構文を使用する必要があり、問題はありませんでした。完全を期すために、問題のあるコードを以下に示します。

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

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

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

初期不良を見てくださった皆様、ありがとうございました。

于 2012-11-01T02:55:58.773 に答える