2011-09-16 161 views
0

我有一個有關釋放非管理對象的查詢。由於非託管對象不直接受CLR控制,所以CLR不能直接釋放它,爲此我們調用dispose命令,但如果我們在該非託管對象的應用程序中未使用dispose命令,則該對象佔用的資源將如何釋放。未管理對象的內存管理

For Ex。如果在C#代碼中,我使用連接對象作爲

try 
{ 
    string strConnectionString = ""; 
    strConnectionString = "Server=FTSPROD\\FTS_PROD;Database=tdps_uat;User ID=txnapp;password=txnapp;Min Pool Size=5;Max Pool Size=10000;"; 
    for (int i = 0; i < 10000; i++) 
    {    
     SqlConnection cnUpdateTransaction;      
     cnUpdateTransaction = new SqlConnection(strConnectionString); 
     cnUpdateTransaction.Open(); 
     cnUpdateTransaction. 
     //cnUpdateTransaction.Close(); 
    } 
} 
catch (Exception Ex) 
{ 

} 

在這裏,我打開10000個連接對象實例並將它留給垃圾收集。現在,因爲它們是非託管對象,所以我不會調用close或dispose,然後最終如何釋放這些對象。操作系統是否會爲此和當做些什麼。請分享你的這個問題的一些文件鏈接。

+0

你正在通過下面的不良做法:初始化變量爲「」,然後立即將其設置爲其他內容;通過不實施'使用'塊;並通過在代碼中包含連接字符串併發布代碼(提示:現在更改數據庫密碼**)。 –

+0

我知道你所說的所有事情,但是這裏寫的代碼是非常基本的,它的目的只是爲了知道如果我們多次打開非託管連接並且沒有調用dispose或close方法,這個非託管連接對象將被釋放。另外我還沒有看到在C#中實現這個類(SqlConnection)的任何終結器。# – funsukvangdu

回答

0

當實施IDisposable並且該類具有非託管資源時,應該實現一個調用Dispose方法的終結器。這樣,如果該類的用戶未能調用Dispose,則非託管資源將在GC運行時最終釋放。舉個例子,見Implement IDisposable correctly

如果對象包含對非託管資源的引用並且不包含終結器,並且Dipose未被調用,則該內存不會自動回收。基本上,有一個內存泄漏。內存不會回收,直到過程關閉。見Identify And Prevent Memory Leaks In Managed Code一些有趣的閱讀。

+0

確實,實現終結器將釋放非託管資源,但我想知道的是,如果我們沒有實現終止器與處置不明確地調用處置然後那些未被管理的對象發生了什麼,它將如何被釋放。什麼操作系統可以清除這些對象 – funsukvangdu