Memory 非托管对象的内存管理

Memory 非托管对象的内存管理,memory,clr,unmanaged,Memory,Clr,Unmanaged,我有一个关于释放非托管对象的问题。由于非托管对象不受CLR的直接控制,所以CLR不能直接释放它,为此我们调用dispose命令,但如果我们在应用程序中未对该非托管对象使用dispose命令,那么该对象占用的资源将如何释放 例如,如果在C代码中,我使用连接对象作为 try { string strConnectionString = ""; strConnectionString = "Server=FTSPROD\\FTS_PROD;Database=tdps_uat;User

我有一个关于释放非托管对象的问题。由于非托管对象不受CLR的直接控制,所以CLR不能直接释放它,为此我们调用dispose命令,但如果我们在应用程序中未对该非托管对象使用dispose命令,那么该对象占用的资源将如何释放

例如,如果在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)
{

}
试试看
{
字符串strConnectionString=“”;
strConnectionString=“Server=FTSPROD\\FTS\u PROD;Database=tdps\u uat;User ID=txnapp;password=txnapp;最小池大小=5;最大池大小=10000;”;
对于(int i=0;i<10000;i++)
{              
SqlConnection cnUpdateTransaction;
cnUpdateTransaction=新的SqlConnection(strConnectionString);
cnUpdateTransaction.Open();
cnUpdateTransaction。
//cnUpdateTransaction.Close();
}
}
捕获(例外情况除外)
{
}

在这里,我打开10000个连接对象实例,并将其留给垃圾收集。现在,由于它们是非托管对象,并且我没有调用close或dispose,那么最后将如何释放这些对象。操作系统是否会为此做些什么,何时做。请与此问题的某些文档链接共享。

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


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

您正在遵循以下错误做法:将变量初始化为“”,然后立即将其设置为其他变量;通过不使用块实现
;通过在代码中包含您的连接字符串,然后发布代码(提示:立即更改您的数据库密码)。我知道您所说的一切,但这里编写的代码非常基本,它的目的只是了解如果我们多次打开非托管连接而不调用dispose或close方法,将如何释放此非托管连接对象。另外,我还没有看到在C中为这个类(SqlConnection)实现任何终结器。实现终结器确实会释放非托管资源,但我想知道的是,如果我们没有用dispose实现终结器,而不是显式地调用dispose,那么非托管对象会发生什么,它将如何释放。操作系统如何清除这些对象