未管理对象的内存管理

时间:2011-09-16 11:33:47

标签: memory clr unmanaged

我有一个关于非托管对象发布的查询。由于非托管对象不直接受CLR控制,因此CLR无法直接释放它,为此我们调用dispose命令但是如果我们在我们的应用程序中没有使用dispose命令来处理该非托管对象,则该对象占用的资源将如何释放。

对于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,所以最后将如何释放这些对象。操作系统是否会为此以及何时执行某些操作。请与您分享此问题的一些文档链接。

1 个答案:

答案 0 :(得分:0)

实现IDisposable并且该类具有非托管资源时,您应该实现调用Dispose方法的Finalizer。这样,如果类的用户无法调用Dispose,则在GC运行时(最终)将释放非托管资源。请参阅Implement IDisposable correctly以获取一个好例子。

如果对象包含对非托管资源的引用且不包含终结器且未调用Dipose,则不会自动回收该内存。基本上,存在内存泄漏。在关闭进程之前,不会回收内存。有关有趣的阅读,请参阅Identify And Prevent Memory Leaks In Managed Code