3

我真的很想推迟问这个问题,因为它似乎应该是一个简单的问题,但这里有。我一直在追逐一段新代码中的段错误。我已经包含了演示以下问题的最小块。其余的代码已经工作了一段时间。

class A {
private:
     std::map <uint64_t, uint32_t> memberMap;
public:
     A();
     ~A();
     void access() {
        const uint64_t key = 1;
        uint32_t value = 1;
        if(memberMap.count(key) == 0) {
             memberMap.insert(std::pair<uint64_t, uint32_t>(key, value));
        } else if(memberMap[key] < value) {
             memberMap[key] = value;
        }
     }
};

class B : public BsParent {
private:
     A handler;
public:
     B();
     ~B();
     uint64_t access(Data dat) {
        //...
        handler.access();
        //...
     }
};

到目前为止我尝试过的...

  • 您会注意到显式指针为零。
  • 我已经检查过是否调用了 A()。
  • 来自 gdb 的堆栈跟踪(是的,已经广泛使用了,没有明显的空指针)将责任归咎于定义 pair 函数的 stl_tree.h:1157。但是,如果我注释掉插入行和 else if 块,程序仍然会在 stl_tree 中另一个模糊的行号处出现段错误。
  • 我通过将 memberMap 设置为 access 中的局部变量并在循环中调用代码来测试 access() 中的代码。

关于进一步调试步骤的任何想法或建议?

4

1 回答 1

0

可能您已经精简了原始代码以保持简单性,但它没有正确传达问题并且不可重现。

虽然它看起来没有任何问题,但如果您使用非本地和本地类类型键/值对的映射,您可能需要两者的复制构造函数。

于 2015-12-04T08:55:52.863 回答