0

我有一个代码需要从 C 语言“翻译”到 Cpp,但我不明白,哪里出了问题。有一部分,它崩溃了(Windows严重错误发送/不发送):

 nDim = sizeMax*(sizeMax+1)/2;
 printf("nDim  = %d sizeMax = %d\n",nDim,sizeMax);
 hamilt = (double*)malloc(nDim*sizeof(double));
 printf("End hamilt alloc. %d allocated\n",(nDim*sizeof(double)));
 transProb = (double*)malloc(sizeMax*sizeMax*sizeof(double));
 printf("End transProb alloc. %d allocated\n",(sizeMax*sizeMax*sizeof(double)));
 eValues = (double*)malloc(sizeMax*sizeof(double));
 printf("eValues allocated. %d allocated\n",(sizeMax*sizeof(double)));
    eVectors  = (double**)malloc(sizeMax*sizeof(double*));
 printf("eVectors allocated. %d allocated\n",(sizeMax*sizeof(double*)));
 if(eVectors) for(i=0;i<sizeMax;i++) {
                 eVectors[i] = (double*)malloc(sizeMax*sizeof(double));
                 printf("eVectors %d-th element allocated. %d allocated\n",i,(sizeMax*sizeof(double)));
                 }
 eValuesPrev = (double*)malloc(sizeMax*sizeof(double));
 printf("eValuesPrev allocated. %d allocated\n",(sizeMax*sizeof(double)));
 eVectorsPrev  = (double**)malloc(sizeMax*sizeof(double*));
 printf("eVectorsPrev allocated. %d allocated\n",(sizeMax*sizeof(double*)));
 if(eVectorsPrev) for(i=0;i<sizeMax;i++) {
                     eVectorsPrev[i] = (double*)malloc(sizeMax*sizeof(double));
                     printf("eVectorsPrev %d-th element allocated. %d allocated\n",i,(sizeMax*sizeof(double)));
                     }

日志:

nDim  = 2485 sizeMax = 70
End hamilt alloc. 19880 allocated
End transProb alloc. 39200 allocated
eValues allocated. 560 allocated
eVectors allocated. 280 allocated 

所以它在分配循环开始时崩溃。如果我删除这个循环,它会在下一行分配时崩溃。这是否意味着像这样的数字我没有足够的内存?

谢谢你。

4

3 回答 3

1

您可能不想分配太多内存。其他一些代码可能已经损坏了堆,之后可能会咬住代码中的任意点。请参阅链接以获取调试帮助。

如果您在无缺陷程序中内存不足,malloc 将返回错误指示。

于 2010-03-21T12:23:17.317 回答
1

在我的机器上,这个程序编译、执行没有错误,并且在通过 valgrind 运行时没有报告内存问题。除非您在小型嵌入式系统上运行,否则您的问题很可能是该代码之外的问题,因为该程序分配的内存总量小于 140 KiB。

此外,当malloc失败时,它不会崩溃,它返回 NULL。此代码正确检查是否为eVectorsPrevNULL,因此此处不应存在 NULL 取消引用问题。

于 2010-03-21T12:28:06.120 回答
0

是什么sizeMax?我没有看到声明,请修复格式。旁注...您在malloc不检查它是否有效的情况下盲目地调用...这是一个危险的假设-永远不要假设有足够的内存可用,因为堆可能变得非常碎片化并且当调用malloc一个非常小的由于内存不足,碎片堆中的对象可能会失败...

于 2010-03-21T13:17:19.447 回答