我正在回到过去大约4年后才能正常工作的C ++应用程序。我的第一个任务是将其从Windows XP / .NET Framework 3.5 / Win32 / VS2008更新到Windows 7 / .NET Framework 4.5 / Win64 / VS2012。
该程序有一个全局映射声明,它现在在第一次尝试插入元素时收到访问冲突,而之前它已正确运行。我在这里查看了所有相关的参考资料,但找不到解决方案,所以我很感激一些帮助。代码如下所示:
Attributes.h :
static void LoadAttributes(void);
Attributes.cpp :
#include "sys\types.h"
#include <map>
static map<string,int> AttributeTable;
void LoadAttributes(void)
{
AttributeTable.insert(pair<string,int>("attribute1",1));
AttributeTable.insert(pair<string,int>("attribute2",2));
...
}
一旦执行第一次插入,就会发出访问冲突。它看起来像一个初始化问题,因为intellisense显示了地图的地址,但是未定义的_Right
和_Left
指针:(_Right=?????, _Left=?????)
。
在方法中本地声明的地图具有这些值。我已经读过,如果静态映射和初始化它的静态方法在不同的文件中,那么初始化顺序不能保证,但这些都在同一个文件中。
编辑 - 回应jww,Dennis Chong,et.al。正如我上面提到的那样,这个问题被标记为重复的问题处理地图和初始化它的方法在2个不同的cpp文件中定义。我理解在这种情况下的订单不能保证。但是,该解决方案指出,当两者位于同一个cpp文件中并且应该是声明项目的顺序时,很好地理解初始化的顺序。出于这个原因,在我看来问题是不同的。
答案 0 :(得分:1)
改变这个:
static map<string,int> AttributeTable;
void LoadAttributes(void)
{
AttributeTable.insert(pair<string,int>("attribute1",1));
AttributeTable.insert(pair<string,int>("attribute2",2));
...
}
要:
map<string,int>& GetAttributeTable()
{
static map<string,int> AttributeTable;
return AttributeTable;
}
void LoadAttributes(void)
{
map<string,int>& AttributeTable = GetAttributeTable();
AttributeTable.insert(pair<string,int>("attribute1",1));
AttributeTable.insert(pair<string,int>("attribute2",2));
...
}