2011-09-16 218 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