新人,C++11使用OpenMP后无法正确delete[]数组

新人求助,C++11使用OpenMP后无法正确delete[]数组
RT,本人菜鸟,在编制一个使用OPENMP的并行高斯约当消去法程序,其中第一步是选取主元(每一阶子阵中最大的元素),初等变换到对角线上。该功能目前应该是已经实现了。但现在遇到一个很奇怪的问题,无论是在并行区内还是外面,几个被声明为shared的数组都无法delete,一执行就导致访问冲突。但如果不delete,那么势必导致内存泄露。很奇怪,想问问大牛们这是怎么回事。


源代码如下:
Matrix Gauss_Elimination(Matrix& A, Matrix& b)  /*只适合恰定方程组*/
{
if (A.get_row() != A.get_col() || A.get_col() != b.get_row() || b.get_col() != 1)
{
std::cerr << "Invaild inputs,operation GaussMethod faild." << std::endl; return Matrix();
};
int n = A.get_row();
Matrix lhs = A; Matrix rhs = b;
int TID;        //线程ID 
int ERR = 0;//错误标志位
int i, j, k;
int* IS_thread_global = new int[omp_get_num_threads()]; int* JS_thread_global = new int[omp_get_num_threads()];
        //全局数组,存放线程本地最大元素的行列号
double* element_temp_global = new double[omp_get_num_threads()];//存放每个线程的最大元素,用于比较
int IS;                                //最终最大元素的行号
int* JS = new int[n];           //最终最大元素的列号
for (int z = 0; z < n; ++z){ JS[z] = 0; };
int I = 0, J = 0;                               //线程私有的最大元素行列号
int count = 0;
double d, t, d_global = 0;
int loop_count = 0;
/*并行搜索最大值*/
for (k = 0; k != n - 1; ++k)
{
IS = k; JS[k] = k;
cout << "Loop count = " << loop_count << " k = " << k << endl;
                #pragma omp parallel private(d,t,J,I,count,TID) private(i,j)                                                    shared(IS_thread_global,JS_thread_global,element_temp_global,IS,JS,d_global)
{
I = 0, J = 0;
TID = omp_get_thread_num();
d = 0;
IS_thread_global[TID] = 0; //所有全局阵列清零,等待写入数据
JS_thread_global[TID] = 0;
element_temp_global[TID] = 0;
                        #pragma omp for                 //矩阵分块,每个线程搜索自己的数组中最大的元素,并记录行列到本地变量
for (i = k; i < n; ++i)
for (j = k; j < n; ++j)
{
t = fabs(*(lhs.element(i, j)));
if (t > d)
{
d = t;
J = j;
I = i;
}
}
IS_thread_global[TID] = I;    //将行列号,本地数值转移到全局数组,等待单线程比较
JS_thread_global[TID] = J;
element_temp_global[TID] = d;
                        #pragma omp master
{
cout << "ELEMENT" << endl;
for (int m = 0; m < 8; ++m)
{
cout << element_temp_global[m] << " ";
}
cout << endl;
cout << "ROW" << endl;
for (int m = 0; m < 8; ++m)
{
cout << IS_thread_global[m] << " ";
}
cout << endl;
cout << "COL" << endl;
for (int m = 0; m < 8; ++m)
{
cout << JS_thread_global[m] << " ";
}
cout << endl;
}
                       #pragma omp barrier    //第一次同步,等待主线程开始进行单线程比较
                       #pragma omp master    //由主线程比较最大值,选出主元后录入行列号到IS,JS[k]
{
std::cout << "Master thread is " << TID << std::endl;
double comp = element_temp_global[0];
/*测试代码*/
cout << "before serial loop, global element array = " << endl;
for (int z = 0; z < omp_get_num_threads(); ++z)