__cdecl _unlock在声明指向指针的点抛出线程错误时与 VS C++ 2010 有问题
__cdecl _unlock has problems with VS C++ 2010 when declare a point to pointer's point throw thread error
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,但话说回来,您的代码的其余部分也是如此。
相关文章:
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++使用params创建线程函数会导致转换错误
- 是什么导致了Unity 3D中的"错误线程异常"?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 线程时访问静态映射时出现隔离错误
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C++多线程程序:变量定义为类成员的隔离错误
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 线程 std::调用未知类型,无法专门化函数错误
- 停止 winapi 线程时出现错误行为
- C++线程错误
- C++线程错误:没有名为"类型"MINGW 的类型
- 可中断线程类 C++11 - 遇到错误?
- 分离的线程:在繁忙时销毁互斥锁 错误C++
- 为同一向量C++运行多个线程时出现分段错误
- 查找最低值.功能.错误:线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x7fff5fc89000)
- MINGW错误:“线程”不是“ STD”的成员