【发布时间】:2011-06-24 20:12:43
【问题描述】:
请考虑以下代码,其中我在 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...
}
【问题讨论】:
-
我不明白你的意思。
-
@Amend,所以请不要再浪费我的时间了。
-
我看不出失败的原因。我怀疑一些注释掉的代码可能会破坏这个对象。 -- 澄清Armen 的评论:可以看到plain-C 风格在这个C++ 中的巨大影响。特别是,您可以在 C++ 中以完全相同的效果声明
struct MYOBJ { ... };(不带 typedef 和尾随名称)。你不能在 C 中做到这一点。 -
“// 为这篇文章删除的初始化代码/简洁”下面是什么?我怀疑错误可能在它下面的某个地方。但是如果你有很多代码,这可能会导致长时间的调试。也许尝试注释掉部分代码,直到 AV 不再出现(至少在那个地方)。
-
@Eric :与您的问题无关,但
_MYOBJ是 C++ 中的非法类型名称。引用 C++03 标准第 17.4.3.1.2/1 节:“每个包含双下划线 (__) 或以下划线后跟大写字母的名称都保留给任何实现使用。"