2016-04-30 22 views
0

私はADO.NET(データベース)を使用してクラスを作成しています。現在、データベースに多くの行を入力してシミュレーションしています。 My機能は、次のいずれかです。メモリ不足例外@ 50Mbメモリ使用量

void CDatabaseAccess::AjouterEchantillon(double tension, double intensite) 
{ 
    OleDbCommand^ cmd = gcnew OleDbCommand("INSERT INTO echantillons (id_course, tension, intensite) VALUES ('"+CDatabaseAccess::GetLastIdCourse()+"', '"+tension+"', '"+intensite+"')", conn); 
    OleDbDataReader^ cmdReader = cmd->ExecuteReader(); 
    delete cmd; 
    delete cmdReader; 
} 

私はこのforループでこの関数を呼び出すしようとすると、私は問題に直面しています:

  for (int j = 0; j < 100; j++) { 
       database->AjouterEchantillon(rDouble, j); 
       Threading::Thread::Sleep(10); 
      } 

は私の問題は次のとおりです:メモリは、それまで上げておきます私のアプリが約50Mbのメモリ使用量のときにクラッシュします。ガベージコレクタが機能していないか、cmdReaderが削除されずにメモリに残っているようです。私はこれを引き起こす原因を知りたい。

+0

これらは使い捨てのオブジェクトです。これらのオブジェクトを削除しないと、GCが頻繁に実行されず、管理されていない*リソースが不足することがあります。 'delete'演算子またはスタックセマンティクスを使用します。 –

+0

私はすでに 'delete cmd'と' delete cmdReader'を私の関数の最後に使ってみましたが、これは何も変わりません。プログラムがクラッシュし続ける – Rameleu

+0

再送信コードを投稿するうれしい仕事です。削除の呼び出しが必要であることをすでに知っている場合、意図的にあなたのスニペットからそれを省略することは愚かなことです。あなたは決して有効な答えを得ることはありません。 –

答えて

0

今日は、.NETメソッドGC::Collect()を使用してガベージコレクションを強制終了しようとしましたが、これは完全に機能しました。

+0

これは、オブジェクトを即座に破棄せず、代わりにGCの清掃とファイナライズに頼っているという理論を確認します。 –

+0

私の方法は、この仕事をするために行うべき正しいことだと思いますか?それともこの前に問題がありますか? – Rameleu