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

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

程序的结构如下:
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> 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;
            }
        }
    }
}

此时问题就解决了。

你可能感兴趣的:(C++,Bug调试,多线程,c++)