C++ __cdecl解锁与VS C和x2B存在问题+;2010年,当声明指向指针的点时';s点抛出线程错误

C++ __cdecl解锁与VS C和x2B存在问题+;2010年,当声明指向指针的点时';s点抛出线程错误,c++,visual-studio-2010,C++,Visual Studio 2010,mlock中发生类型为“System.Runtime.InteropServices.SehexException”的未处理异常。c at _cdecl _unlock()函数 我的代码在下面 ` void Compute_AB(双*gpo,双*x,双*nv,双**ds,双***a,双***b,整数mm2,整数nx,整数ndex) { //!------------------------------------------------------------------ //!计算A矩阵和B矩

mlock中发生类型为“System.Runtime.InteropServices.SehexException”的未处理异常。c at _cdecl _unlock()函数

我的代码在下面 `

void Compute_AB(双*gpo,双*x,双*nv,双**ds,双***a,双***b,整数mm2,整数nx,整数ndex)
{
//!------------------------------------------------------------------
//!计算A矩阵和B矩阵及其导数
//!输入--GPO、x、nv、dm、nx、numnode、ndex、mm
//!输出--a,b
//!从a的第三维的1到10表示
//!a,dax,day,daxx,daxy,dayy,dadxxx,dadxxy,dadxy,dadyyy
//!从b的第三维的1到10表示
//!b,dbx,dby,dbxx,dbxy,dbyy,dbdxxx,dbdxxy,dbdxyy,dbdxyy,dbdyyy
//!----------------------------------------------------------------
双**w;
int numnode=ndex;
双精度**p=新双精度*[6];

对于(inti=0;i,您应该真正注意@stijn所说的内容。另外,关于代码的可读性和自文档化

无论如何,问题在于,在VC++运行时,你在内存堆上分配了太多内存块。你必须查看内存分配代码来查看这个错误是如何发生的。所以,问题是你使用的运行时环境和它的实现,而不是C++标准。精灵

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

所以

然后使用

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

注意到,这不是现代C++的惯用用法,它在风格上比C++更接近C,但是,代码的其余部分也是如此。

StAcExobe不是“请修复我的代码”站点,请至少省掉所有无用的注释,使代码可读和格式化。ILY读这个代码,你怎么期望编译器/链接器从它中创建一个工作程序?什么?@斯蒂恩说。看起来你遇到了一些内存分配或访问问题,可能与多线程有关,而从托管代码中执行一些非托管C++。你在堆上分配至少47092×3个小块。如果要分配较大的内存块,则应尝试将其分配到一个内存块(或至少更少的较大内存块)最大限度地减少堆管理开销。错误本身似乎并不存在于您在最后突出显示的代码中,因此它似乎与您对该代码的运行时所做的操作有关。感谢ofr stijn和PeterT。如果numnode=100,代码运行得很好;可能不太可读,但它确实工作正常。I我已经用numnode=100验证了结果。我对彼得的建议很感兴趣。我的一个朋友还指出,这可能与线程问题有关。但事实上,这个程序是设计为单线程的。我已经更换了几台计算机,以便在每次它崩溃时运行它,正如我在最后提到的代码。彼得能给出更多建议吗ns.在主代码中,我使用istream读取文件,但这有关系吗?@Jane我会使用更少的分配,您需要使用更少的
new
。如果您想要
double[47092][3][3]
的话,只需写入
int-dim1=47092;int-dim2=3;double*ppp=new-double[dim1*dim2*dim3]就可以在连续的内存中获得它;
然后您可以通过编写
ppp[i*dim2*dim3+j*dim3+k]
而不是
ppp[i][j][k]来访问它请注意,这比C++风格更为C++,而惯用的C++看起来则完全不同。欣赏PeterT的建议。你说的对。我需要做的就是把大量的小块变成大的块。这意味着我用了一个一维的指针来代替3D指针PP,现在它工作得很好。我希望栈流能K。为像我这样的新手制作这张海报,以解决类似的问题
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 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];