__cdecl _unlock在声明指向指针的点抛出线程错误时与 VS C++ 2010 有问题



mlock中发生类型为"System.Runtime.InteropServices.SHException"的未处理异常。c在__cdecl_unlock()函数处。

我的代码在下面`

void Compute_AB(double *gpos,double **x, double *nv,double **ds,double ***a,double ***b,int mm2,int nx, int ndex)
 {
//!------------------------------------------------------------------
//! Compute A matrix and B matrix and their derivatives
//! input--gpos,x,nv,dm,nx,numnode,ndex,mm
//! output--a,b
//! From 1 to 10 of the third dimension of a denotes
//!    a,dax,day,daxx,daxy,dayy, dadxxx,dadxxy,dadxyy,dadyyy
//! From 1 to 10 of the third dimension of b denotes
//!    b,dbx,dby,dbxx,dbxy,dbyy,dbdxxx,dbdxxy,dbdxyy,dbdyyy
//!----------------------------------------------------------------
 double **w;
 int numnode=ndex;
 double **p=new double*[6];
 for(int i=0;i<6;i++)
 {p[i]=new double[ndex];
 for (int j=0;j<ndex;j++)
 p[i][j]=0.0;
 }
 //inintial pp
 double ***pp=new double**[numnode];
 for(int i=0;i<numnode;i++)
 {

 pp[i]=new double*[mm2];
 for(int j=0;j<mm2;j++)
{    pp[i][j]=new double[mm2];
 /*for(int k=0;k<mm2;k++)
     pp[i][j][k]=0.0;*/}
 }
 //initial diff;
 double **dif;
    dif=new double*[nx];
    for(int i=0;i<nx;i++)
    {
        dif[i]=new double[ndex];
        for(int j=0;j<ndex;j++)
        {
        dif[i][j]=0.0;
          //std::cout<<dif[i][j]<<", " ;
        }
         //std::cout<<std::endl;*/
    }
    //end initial
    //////////////////////////////////
    //initial **w
    w=new double*[numnode];
    for (int i=0;i<numnode;i++)
{
    w[i]=new double[10];
    for(int j=0;j<10;j++)
        w[i][j]=0.0;

}
        // initial xv
        double **xv=new double*[nx];
        for(int j=0;j<nx;j++)
            xv[j]=new double[numnode];
        //////////////////////////////////
        ///         INITIAL P

     for(int i=0;i<ndex;i++){
         int nn;
         nn=int(nv[i]);
         xv[0][i]=x[0][nn];
         xv[1][i]=x[1][nn];
p[0][i]=1.0;
p[1][i]=xv[0][i];
p[2][i]=xv[1][i];
p[3][i]=xv[0][i]*xv[0][i];
p[4][i]=xv[0][i]*xv[1][i];
p[5][i]=xv[1][i]*xv[1][i];
         dif[0][i]=gpos[0]-xv[0][i];
         dif[1][i]=gpos[1]-xv[1][i];
     }

     ///////////////////////// end initial
    /*mexPrintf("out w before calculation:n");
for(int i=0;i<ndex;i++)
    {
        for(int j=0;j<10;j++)
    mexPrintf("%g  ",w[i][j]);
mexPrintf("n");
}*/
Weight_W1(dif,nv,ds,w,ndex);// another function, it works as a single function
// ************* Compute b and its derivatives
      for(int ii=0;ii<mm2;ii++)
      {  for( int jj=0;jj<ndex;jj++)
         {  for(int kk=0;kk<10;kk++)
              { b[ii][jj][kk]=p[ii][jj]*w[jj][kk];
      }
      }
      }
      // display B
// ************* Compute a and its derivatives
      for(int ie=0;ie<mm2;ie++)
         for(int je=0;je<mm2;je++)
           for(int ke=0;ke<10;ke++)
           {     a[ie][je][ke]=0.0;}


           for(int iii=0;iii<ndex;iii++)
         {  for(int ik=0;ik<mm2;ik++){
        for(int jk=0;jk<mm2;jk++ )
        {pp[iii][ik][jk]=p[ik][iii]*p[jk][iii] ;
           }
           }
           }
        for(int iii=0;iii<ndex;iii++)
       for(int ikk=0;ikk<mm2;ikk++)
           for(int jkk=0;jkk<mm2;jkk++)
            for(int kkk=0;kkk<10;kkk++)
            {
                  a[ikk][jkk][kkk]=a[ikk][jkk][kkk]+w[iii][kkk]*pp[iii][ikk][jkk];
           }
       for(int ikk=0;ikk<mm2;ikk++)
           {for(int jkk=0;jkk<mm2;jkk++)
            {for(int kkk=0;kkk<10;kkk++)
            {


            }
       }

       }

}`

当代码运行到时发生错误

double ***pp=new double**[numnode];
 for(int i=0;i<numnode;i++)
 {

 pp[i]=new double*[mm2];
 for(int j=0;j<mm2;j++)
{    pp[i][j]=new double[mm2];
 /*for(int k=0;k<mm2;k++)
     pp[i][j][k]=0.0;*/}
 }

numnode=47092;mm2=3,nx=2;ndex=numnode2

帮助。感谢

你真的应该注意@stijn说的话。此外,关于代码的可读性和自文档。

无论如何,关于你的问题,问题似乎是你在VC++运行时的堆上分配了太多的小块内存。您必须查看内存分配代码才能了解这个错误是如何实际发生的。因此,问题在于您使用的运行时环境及其实现,而不是C++标准本身。

如果不完全理解根本原因,您可以分配一个包含多维数组所有元素的连续数组来避免这种情况的发生。

所以,

int numnode = 47092;
int mm2 = 3;
double ***pp=new double**[numnode];
for(int i=0;i<numnode;i++)
{
    pp[i]=new double*[mm2];
    for(int j=0;j<mm2;j++)
    {
        pp[i][j]=new double[mm2];
        for(int k=0;k<mm2;k++)
            pp[i][j][k]=0.0;}
}

可以重写为

int dim1 = 47092;
int dim2 = 3;
int dim3 = 3;
double *arr=new double[dim1*dim2*dim3];

然后使用访问

arr[i*dim2*dim3 + j*dim3 + k];
//in place of pp[i][j][k];

请注意,这不是现代C++的惯用语,而且在风格上比C++更接近C,但话说回来,您的代码的其余部分也是如此。

相关内容

最新更新