请考虑以下代码,我在其中获取了将值插入std :: map对象的访问冲突。不知道为什么。您看到的代码使用
std::map<int, int>
然而,我最初尝试过
std::map<int, MSGTYPE>
具有相同的结果访问冲突。 (我知道枚举是INT)。
// a common include file has this
// common.h
enum MSGTYPE
{
MSG_R1,
MSG_A1,
MSG_L1,
MSG_S1,
MSG_S2
};
typedef std::map<int, int> SYSMsgMap;
typedef struct _MYOBJ
{
int x1;
int x2;
SYSMsgMap XFerMap;
}MYOBJ;
我对这些结构的使用如下:
MYOBJ *cMYOBJ::AddNetwork(cvnet *net)
{
MYOBJ *ob;
ob = new MYOBJ();
// initialization code removed for this post/brevity
BuildMsgMap(ob->XFerMap);
// rest removed for this post/brevity
}
void cMYOBJ::BuildMsgMap(std::map<int, int> &mm)
{
mm.clear();
switch(NETTYPE)
{
case 1:
mm[ 1] = MSG_R1; <-- Access violation here!
mm[ 2] = MSG_A1;
mm[ 4] = MSG_L1;
mm[16] = MSG_S1;
mm[32] = MSG_S2;
break;
// rest removed...
}
答案 0 :(得分:2)
在ob
后memset(ob, sizeof(MYOBJ), 0)
之前和ob = new MYOBJ;
来电之前,BuildMsgMap()
是不是memset
意外清除了?
(因为代码是遗留的,因为{{1}}技巧经常在C中使用。)
答案 1 :(得分:0)
我认为因为mm是对mm [0]的引用,这就是你所拥有的所有内存分配 所以对于mm [1]你需要插入。
或者你想做
ob = new MYOBJ[33];//since you have indexed mm[32] in the next function
希望这会有所帮助
答案 2 :(得分:0)
我认为您正在获取访问冲突,因为MYOBJ没有定义构造函数,因此未调用SYSMsgMap的构造函数。向MYOBJ添加一个空的无参数构造函数,看它是否改变了一些东西,例如
typedef struct _MYOBJ
{
_MYOBJ() {}
int x1;
int x2;
SYSMsgMap XFerMap;
}MYOBJ;