c++ 内存问题 重复释放

 ###### 问题遇到的现象和发生背景
在使用c++读取nc文件时,使用了里面的一个接口 extern int nc_get_var_short(int ncid, int varid, short *ip), nc库的官方文档在这里https://docs.unidata.ucar.edu/netcdf-c/current/dvarget_8c_source.html#l01057 这个接口是根据文件id和变量id,将数据存入第三个参数中。而且第三个变量是必须要提前分配内存的,所以之后也需要自己手动释放。在我的程序里,定义了两个二维数组,并且动态分配了空间,但是当我使用完需要释放时,我的var_val_real可以正常释放,但是释放var_val_pri 就会报错 double free or corruption (!prev)。
求指点,卡在这里好多天了

 ###### 用代码块功能插入代码,请勿粘贴截图

vector<double> NcGetData::getvarData(const char* varName){
    cout << "getVarData start!" << endl;
    vector<double> ncVarData;

    cout << "getvarData::ncid = " << ncid << endl;

    /* 构建NC变量对象,构造函数主要工作包括根据输入的ncid以及变量名,自动赋值经纬度长度,以及获取变量id赋值给NC对象 */
    NcVar nv(ncid, varName);

    cout << "NC structure completed !" << endl;

    int varid = nv.getVarid(nv.ncid, nv.varName);

    double **var_val_real = (double**)malloc(sizeof(double*)*nv.latlength); //开辟行
    for(int i = 0; i < nv.latlength; i++)
    {
        *(var_val_real+i) = (double*)malloc(sizeof(double)*nv.lonlength);//开辟列
    }
    cout << "var_val_real memory allocated !" << endl;
    short **var_val_pri = (short**)malloc(sizeof(short*)*nv.latlength); //开辟行
    for(int i = 0; i < nv.latlength; i++)
    {
        *(var_val_pri+i) = (short*)malloc(sizeof(short)*nv.lonlength);//开辟列
    }
    cout << "var_val_pri memory allocated !" << endl;

    attStruct varStruct = getvarAttStruct(ncid,varid);

    cout << "getvarData: start to get data----" << endl;
    retval = nc_get_var_short(ncid,varid,&var_val_pri[0][0]);
    cout << "getvarData: get data done !" << endl;

    /* 存储变量值 */
    for(int i = 0; i < nv.latlength ; i++){
        for(int j = 0; j < nv.lonlength; j++){
            if(var_val_pri[i][j] <= varStruct.att_val_max && var_val_pri[i][j] >= varStruct.att_val_min) {
                var_val_real[i][j] = var_val_pri[i][j] * varStruct.att_val_sca + varStruct.att_val_offset;
            }
            else var_val_real[i][j] = var_val_pri[i][j];
            ncVarData.push_back(var_val_real[i][j]);
        }
    }
    cout << "getVarData over!" << endl;
    cout << ncVarData.size() << endl;
    cout << nv.latlength << endl;

    for(int i = 0; i < nv.latlength;i++)
        free(*(var_val_real+i));
    cout << "var_val_real free done !" << endl;
    for(int i = 0; i < nv.latlength;i++){
        cout << i << endl;
        /* 运行到此处就会报错  double free or corruption (!prev) */
        free(*(var_val_pri+i));
    }
    free(*(var_val_pri));

    cout << "var_val_pri memory free done!" << endl;

    return ncVarData;
}

 ###### 运行结果及报错内容
double free or corruption (!prev)
 ###### 我的解答思路和尝试过的方法
之前以为是动态分配内存的问题,但是自己试过,好像无关。自己怀疑是在nc_get_var_short这个接口上出了问题,因为在这个接口里面,使用了var_val_pri ,没有用var_val_real,最后就是var_val_pri 释放报错,但是var_val_real释放正常。但是由于个人能力有限,在看了官方文档后,还是没找到原因。

 ###### 我想要达到的结果

你这肯定报错啊,内存重复释放了,


   for(int i = 0; i < nv.latlength;i++){
        cout << i << endl;
        /* 运行到此处就会报错  double free or corruption (!prev) */
        free(*(var_val_pri+i));
    }
   // free(*(var_val_pri)); 这里重复释放了,注释掉