【问题标题】:pointer to std::map trouble指向 std::map 问题的指针
【发布时间】: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 节:“每个包含双下划线 (__) 或以下划线后跟大写字母的名称都保留给任何实现使用。"

标签: c++ stl stdmap std


【解决方案1】:

obob = new MYOBJ; 之后和调用BuildMsgMap() 之前的某个地方不会被memset(ob, sizeof(MYOBJ), 0) 意外清除吗?

(由于代码是遗留代码,并且由于 C 中经常使用 memset 技巧。)

【讨论】:

  • 你提到这个很有趣。你其实是对的!在我发布这篇文章之前,事实上我确实在新的被注释掉的之后有一个 memset。我也把新的MYOBJ改成了新的MYOBJ();
【解决方案2】:

我认为由于 mm 是对 mm[0] 的引用,这就是您所获得的所有内存分配 所以对于 mm[1] 你需要做一个插入。

或者你想这样做

ob = new MYOBJ[33];//since you have indexed mm[32] in the next function

希望对你有帮助

【讨论】:

  • map 的索引操作符是 T&,而不是 pair。编译器也会选择它。
【解决方案3】:

我认为您遇到了访问冲突,因为 MYOBJ 没有定义构造函数,因此没有调用 SYSMsgMap 的构造函数。向 MYOBJ 添加一个空的无参数构造函数,看看它是否改变了一些东西,例如

typedef struct _MYOBJ
{
  _MYOBJ() {}
  int x1;
  int x2;
  SYSMsgMap XFerMap;
}MYOBJ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2021-05-13
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2016-02-27
    相关资源
    最近更新 更多