访问冲突插入元素到全局映射

时间:2014-09-15 21:40:04

标签: c++ windows visual-studio-2012 win64

我正在回到过去大约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文件中并且应该是声明项目的顺序时,很好地理解初始化的顺序。出于这个原因,在我看来问题是不同的。

1 个答案:

答案 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));
    ...
}