指向std :: map麻烦的指针

时间:2011-06-24 20:12:43

标签: c++ stl stdmap std

请考虑以下代码,我在其中获取了将值插入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...
}

3 个答案:

答案 0 :(得分:2)

obmemset(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;