【问题标题】:memory corruption due to #pragma pack error - std map corruption- crashing on insert由于#pragma pack 错误导致的内存损坏 - 标准映射损坏 - 插入时崩溃
【发布时间】:2012-10-31 07:18:31
【问题描述】:

我有一个项目,我正在处理其中的 std 映射有一些奇怪的行为。

我有自己的 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)

我应该查看哪些其他方面可能会导致问题。它可能在我链接的库中吗?我创建了第二个项目,只有这些代码行链接到相同的库(但没有任何代码调用它们。)并且它不会崩溃。

【问题讨论】:

  • 如果您发布的代码确实是所有代码,那么可能导致您的问题的唯一是由LoggerPtr syslogger(Logger::getLogger("CISInterface")); 引起的堆损坏。 main 中的代码是正确的。尝试注释掉该行,看看您是否仍然遇到崩溃。
  • 我刚刚复制了您的main() 并在此处运行(Ubuntu 12.04,gcc 4.6.3)。到目前为止没有问题。错误一定在其他地方。
  • 我在这段代码中看到的唯一问题是您的MyMapDefstd::map&lt;string, string&gt; 而它应该是std::map&lt;const string, string&gt;,因为一旦您插入到一张地图。
  • @Murilo - 地图将在内部存储pair&lt;const Key, Data&gt;,因此map&lt;string, string&gt; 有一个 const 键。
  • @user1787720 您可以发布自己问题的答案,然后接受它,它不会显示为未回答的问题。不知道这是否是正确的方法,但它会起作用!

标签: c++ stl crash


【解决方案1】:

问题解决了。

我想我会在这里添加它,以防其他人做同样的事情。

我慢慢删除了项目中的文件以尝试找到有问题的文件。我在想它一定是在导致问题的头文件中定义的东西(比如静态)。花了很长时间,但我想我已经找到了。我有一个定义了许多结构的头文件。这些被序列化到线路上,所以我使用 #pragma pack (push) 将它们对齐 1 个字节,我把它放在文件的顶部,#pragma pack (pop) 在底部。但是我随后在第一个 #pragma 定义之后添加了几个 #include 语句,这意味着这些包含错误地对齐并导致了一些不确定的行为。感谢所有看过的人。应该可能使用 attribute 语法,我不会有问题。为了完整起见,下面有违规代码。

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

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

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

感谢所有查看初始问题的人。

【讨论】:

  • 忘记#pragma pack(pop)也会造成类似的效果
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多