c++ - 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;
}
解决方案
推荐阅读
- php - 有没有办法使用 PHP 在 UPDATE 语句中获取价值?
- powershell - Powershell 导入模块无法正常工作
- mongodb - 使用带有 upsert 的 bulkwrite 时,Mongo 的性能会下降
- python - 无法使用 LDP 身份验证提供程序对 Askbot 进行身份验证
- angular - 使用 formData 向 HTTP 发送数据时面临的问题
- ios - 以编程方式禁用键盘的 iOS QuickPath 功能
- mysql - 如何解析多个查询参数并将它们传递给 sql 命令
- python - 从动态填充的组合框中返回选定的值作为全局变量?
- azure - 具有持久 Azure 功能的 .NET Core DDD
- javascript - 如何一一提取作为关联数组(对象)的值的数组元素