Error in `./rgbd_tum‘: double free or corruption (!prev): 0x00007f3b385d0a40错误解决

C++程序运行过程中遇到了下列错误:
Error in `./rgbd_tum’: double free or corruption (!prev): 0x00007f3b385d0a40,且错误出现的时间点随机,如下图所示:在这里插入图片描述
上网查了资料,有人说是内存访问越界了,但是仔细检查程序之后没有此情况,经过反复思考,才发现是线程间共享资源访问冲突了,下面介绍一下问题以及解决办法:

程序的结构如下:
MapObject.h:

public:
	std::vector<VoxelNode *> GetAllVoxels();
	void UpdateVoxelMap(KeyFrame* pKFs);
private:
	std::vector<VoxelNode *> mVoxels;

MapObject.cc:

std::vector<VoxelNode *> GetAllVoxels()
{
    return mVoxels;
}

void UpdateVoxelMap(KeyFrame* pKF)
{
    bool findvoxel = false;
    
    for(auto p:ground.points)
    {
        findvoxel = false;
        pcl::PointXYZRGB point;

        for (size_t voxel_id = 0; voxel_id < mVoxels.size(); voxel_id++)
        {
            if(mVoxels[voxel_id]->isContainPoint(point))
            {
                mVoxels[voxel_id]->AddPoint(point);
                findvoxel = true;
                break;
            }
        }
    }
}

主程序中拥有若干个线程,在Viewer线程中调用GetAllVoxels()函数,Tracking线程调用UpdateVoxelMap()函数,而两个函数存在访问同一个变量*std::vector<VoxelNode > mVoxels,由此造成了访问冲突。
解决办法:加互斥锁
1、在MapObject.h中添加std::mutex mMutexVoxels变量,添加完成后如下所示:

public:
	std::vector<VoxelNode *> GetAllVoxels();
	void UpdateVoxelMap(KeyFrame* pKFs);
private:
	std::vector<VoxelNode *> mVoxels;
	std::mutex mMutexVoxels;

2、在两个函数访问此变量时加上互斥锁,如下所示:

std::vector<VoxelNode *> GetAllVoxels()
{
    unique_lock<mutex> lock(mMutexVoxels);
    return mVoxels;
}

void UpdateVoxelMap(KeyFrame* pKF)
{
    unique_lock<mutex> lock(mMutexVoxels);
    for(auto p:ground.points)
    {
        findvoxel = false;
        pcl::PointXYZRGB point;

        for (size_t voxel_id = 0; voxel_id < mVoxels.size(); voxel_id++)
        {
            if(mVoxels[voxel_id]->isContainPoint(point))
            {
                mVoxels[voxel_id]->AddPoint(point);
                break;
            }
        }
    }
}

此时问题就解决了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值