首页 > 解决方案 > Address Sanitizer:在遍历 shared_ptr 的映射并超出范围时自由崩溃后的堆使用

问题描述

我正在尝试创建一个包含 shared_ptr 作为值的映射。在函数 deleteB 中,我遍历映射以查找特定的键值,当找到时,我删除特定的键、值对并跳出 for 循环,但是作为很快我从 deleteB 函数中出来,程序崩溃了。我使用了地址清理程序,它显示了heap use after free error。不确定,这个崩溃到底发生在哪里。

struct MyObj{
  int val;
  void* ctx;
};

class A{
  private:
    MyObj obj;
    int countVal;
  public:
  A(int value){
     countVal = value;
     obj = (MyObj){countVal, this};
  }
  ~A(){}
   MyObj getObj(){
     return obj;
   }
};

class B{
  private:
  int count = 0;
  map<uint32_t, shared_ptr<A>> mB;

  public:
   void createB(MyObj &obj, int &getCount){ 
    ++count;
    mB[count] = make_shared<A>(count);
    obj = mB[count]->getObj();
    getCount = count;
   }

   void deleteB(int Val){
       if(!mB.empty()){
         for(auto &a : mB){
           if(a.first == Val){
              mB.erase(a.first);
              break;
           }
         }
       }
   }
};


int main(){
  B b;
  MyObj objVal;
  int count = 0;
  b.createB(objVal, count);
  b.deleteB(count);
  return 0;
}

标签: c++

解决方案


推荐阅读