2012-10-31 42 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)'也可能导致类似的效果 –