2016-04-30 27 views
0

我正在使用ADO.NET(數據庫)類,我目前正在模擬輸入很多行到我的數據庫。我的功能是以下之一:內存不足異常@ 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運行不夠頻繁,那麼您肯定會用完* unmanaged *資源。使用'delete'運算符或堆棧語義。 –

+0

我已經嘗試在我的函數結尾處使用'delete cmd'和'delete cmdReader',但這不會改變任何內容。該程序不斷崩潰 – Rameleu

+0

好,張貼repro代碼很好的工作。如果您已經知道調用delete是必需的,那麼有意將它從代碼片段中省略是一件愚蠢的事情,您永遠不會得到可用的答案。 –

回答

0

好吧,今天我只是試圖強制垃圾收集使用.NET方法GC::Collect()在我的方法結束,它的工作完美。

+0

這證實了這樣一種理論,即您不是在迅速處置對象,而是依靠GC清理併爲您完成它們。 –

+0

您認爲我的方法是做這件事的正確之舉嗎?還是在這之前有問題? – Rameleu