访问成员stl映射时的C++Segfault

C++ Segfault when accessing member stl map

本文关键字:C++Segfault 映射 成员 stl 访问      更新时间:2023-10-16

我真的试着推迟问这个问题,因为它看起来应该是一个简单的问题,但现在开始了。我一直在寻找一段新代码中的一个segfault。我在下面包含了演示这个问题的最小部分。代码的其余部分已经运行了一段时间。

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中的另一个模糊行号处分段
  • 我在access()中测试了代码,使memberMap成为access中的局部变量,并在循环中调用代码

对进一步的调试步骤有什么想法或建议吗?

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

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