C++ 由于#pragma pack错误导致内存损坏-标准映射损坏-插入时崩溃

C++ 由于#pragma pack错误导致内存损坏-标准映射损坏-插入时崩溃,c++,stl,crash,C++,Stl,Crash,我有一个项目,我正在工作,我有一些奇怪的行为和性病地图 我定义了自己的typedef映射,它将字符串映射到自定义类型的指针。在我将第一对添加到映射后,只要超出映射,应用程序就会崩溃 在经历了很多混乱之后,我将地图更改为a,并将其移动到应用程序中的第一个调用,但它仍然崩溃。我不知道会发生什么事。任何帮助都将不胜感激 下面是当前崩溃的代码 LoggerPtr syslogger(Logger::getLogger("CISInterface")); int main(int argc, char

我有一个项目,我正在工作,我有一些奇怪的行为和性病地图

我定义了自己的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. 
...
LoggerPtr系统记录器(Logger::getLogger(“CIinterface”);
int main(int argc,char*argv[])
{
typedef std::map MyMapDef;
MyMapDef-tmpString;
tmpString.insert(MyMapDef::value_type(“0000”,“d”);
插入(MyMapDef::value_type(“1111”,“d”);//在此崩溃。
tmpString.insert(MyMapDef::value_type(“2222”,“d”);
//std::字符串配置文件;
//INTC;
//如果(argc<2)
//  {
////必须有c选项
//std::cout问题已解决

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

我慢慢地删除了项目中的文件,试图找到有问题的文件。我想它一定是头文件中定义的导致问题的东西(比如静态文件)。这花了很长时间,但我想我已经找到了。我有一个头文件,它定义了许多结构。这些结构被序列化到网络上,所以我使用我放在文件顶部的#pragma pack(push)和#pragma pack(pop)将它们对齐1字节在底部。但是我在第一个pragma定义之后添加了两个include语句,这意味着这些include没有正确对齐,并导致了一些不确定的行为。感谢所有看过的人。可能应该使用属性语法,我就不会有问题了。下面是关于co的违规代码简单

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

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

typedef struct 
{ 
....
}
#pragma pack (pop) 
#pragma包(推送)
#布拉格语包(1)
#include//includes的位置不对!
#包括
类型定义结构
{ 
....
}
#布拉格语包(流行语)

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

如果您发布的代码实际上就是所有代码,那么唯一可能导致您的问题的就是由
LoggerPtr syslogger(Logger::getLogger(“CIinterface”)引起的堆损坏
main
中的代码是正确的。试着注释那一行,看看你是否仍然会崩溃。我刚刚复制了你的
main()
,并在这里运行了它(Ubuntu 12.04,gcc 4.6.3)。到目前为止没有问题。错误一定在其他地方。我在这段代码中看到的唯一问题是,您的
MyMapDef
std::map
,而它应该是
std::map
,因为一旦插入到映射中,您就无法更改密钥。@Murilo-映射将在内部存储
pair
,因此
map
>将有一个常量键。@user1787720您可以发布自己问题的答案,然后接受它,它不会显示为未回答的问题。不知道这样做是否正确,但它会起作用!忘记
#pragma pack(pop)
#pragma pack (push)
#pragma pack (1)

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

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