csp910809 2019-12-27 20:42 采纳率: 100%
浏览 661
已采纳

OpenMP 并行堆内存释放问题

malloc函数声明一个二维动态数组A,使用omp并行对A赋值,然后释放A内存时报错。在不使用并行时,不会报错。谢谢!代码如下:
void main(){

void main(){

    int i,j, Njuncs=1827;
    //创建二维数组A
    double**A = (double **)malloc(sizeof(double *)*(Njuncs + 1)); 
    for (i = 0; i < Njuncs + 1; i++)
        *(A + i) = (double  *)malloc(sizeof(double) * (Njuncs + 1)); 

#pragma omp parallel
    {
#pragma omp for
        for (i = 0; i <= Njuncs; i++)
            for (j = 0; j <= Njuncs; j++)
                A[i][j] = 1;
    }
    for (i = 0; i < Njuncs + 1; i++){
        free(*(A + i));//该步报错
        A[i] = NULL;
    }
    free(A);
}
  • 写回答

2条回答 默认 最新

  • sculxp 2019-12-28 09:32
    关注

    其实并行多重循环这么写肯定是有问题的,内部循环变量j是共享的,被多个线程同时修改,那么就很有可能超出Njuncs,发生内存越界写入,**切记循环内的变量写入是并行的**。
    应该把 j 声明为并行体中私有的,这样结果就正确了,参考如下代码:

    #include <cstdlib>
    
    int main(int argc, char* argv[]) {
        int i, j, Njuncs = 1827;
        //创建二维数组A
        double** A = (double**)malloc(sizeof(double*) * (Njuncs + 1));
        for (i = 0; i < Njuncs + 1; i++)
            *(A + i) = (double*)malloc(sizeof(double) * (Njuncs + 1));
    
    #pragma omp parallel
        {
    #pragma omp for private(j)
            for (i = 0; i <= Njuncs; i++)
                for (j = 0; j <= Njuncs; j++) {
                    A[i][j] = 1;
                }
        }
    
    #pragma omp parallel for
        for (i = 0; i < Njuncs + 1; i++) {
            free(*(A + i));//该步报错
            A[i] = NULL;
        }
        free(A);
    
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络