2016-04-19 28 views
2

C++の関数では非常に深刻な問題が発生しています。これはC++は1つの関数を繰り返し呼び出しています

double** Fun1(unsigned l,unsigned n, vector<int>& list, 
        vector<string>& DataArray) 
{ 
    double** array2D = 0; 
    array2D = new double*[l];  
    string alphabet="ACGT"; 
    for (int i = 0; i < l; i++) 
    { 
     array2D[i] = new double [4]; 
     vector<double> count(4, 0.0); 
     for(int j=0;j<n;++j) 
     { 
      for(int k=0;k<4;k++) 
      { 
       if (toupper(DataArray[list[j]][i])==alphabet[k]) 
        count[k]=count[k]+1; 
      } 

     } 

    for(int k=0;k<4;k++) 
     array2D[i][k]=count[k]; 

     count.clear(); 
    } 

    return array2D; 
} 

私の関数であり、Lの値は約100であり、n = 1であり、DataArrayサイズは(50000 X L)とリストは0から49999の間のいずれかの数を含むことになります。 今私はメインプログラムからこの関数を何度も呼び出しています(5千万回以上かかるかもしれません)。特定の回数までそれは非常に滑らかになりますが、2/3分後に私のシステムがハングアップします。私はこのコードに何が問題であるかを見つけることができません。私は記憶が不足していると思うのですが、なぜか分からないのですか?

+2

'new'sがたくさんありますが、どこに' delete'sがありますか? – Mat

+0

あなたは 'delete []'を使わないので。 –

+0

メモリリーク(https://en.wikipedia.org/wiki/Memory_leak)がスラッシングにつながる(https://en.wikipedia.org/wiki/Thrashing_(computer_science)_ –

答えて

3

コードに対応するdelete[]がありません。

[]は、配列を削除することに注意してください。これらを追加することを忘れた場合は、未定義領域(3.7.4.2 in N3797)に向かいます。

newdelete[]をあまりにも軽減するために、std::arrayを使用してみてください。また、これがあなたの言うとおりに呼び出され、ループがこのように小さい場合、私はデータの一貫性について懸念します。一定回数件まで

+0

*これらを追加するのを忘れた場合は、最初の要素を削除する*実際には未定義の振る舞いですVC++はうまく動作しています(少なくとも2つの演算子は少なくとも古いバージョンでは同じコードに転送されています)、 'new []'/'delete [] '不一致。 –

0

はそれが非常にスムーズに行くが、私のシステムは

がハングアップしないハング周りの2/3分 後。 linuxまたは unixマシンチェック top (system performance)で作業している場合。システムの仮想メモリがいっぱいになりました。 deleteまたは delete[]を適切に実行してください new

関連する問題