0

C から Cpp に「変換」する必要があるコードがありますが、どこに問題があるのか​​理解できません。クラッシュする部分があります (Windows の重大なエラー send/dontSend):

 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 を返します。このコードeVectorsPrevは NULL であることを適切にチェックするため、NULL 参照解除の問題は発生しないはずです。

于 2010-03-21T12:28:06.120 に答える
0

とはsizeMax? 宣言が表示されません。フォーマットを修正してください。補足説明...機能しているmallocかどうかを確認せずに盲目的に呼び出しています...これは危険な仮定です-ヒープが非常に断片化する可能性がありmalloc、非常に小さい断片化されたヒープ内のオブジェクトは、十分なメモリがないため失敗する可能性があります...

于 2010-03-21T13:17:19.447 に答える