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