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);
}
其实并行多重循环这么写肯定是有问题的,内部循环变量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;
}
参考:https://blog.csdn.net/kebu12345678/article/details/79112052