我可以使用托管列表安全地跟踪非托管资源吗?

时间:2014-12-17 15:13:16

标签: c# idisposable finalizer

假设我有一个使用List< IntPtr>的一次性类。跟踪非托管资源:

public class MyDisposableClass : IDisposable
{
    private readonly List<IntPtr> _myUnmanagedResources = new List<IntPtr>();

    ~MyDisposableClass()
    {
        Dispose();
    } 

    public void Dispose()
    {
        // What is the state of "_myUnmanagedResources," at this stage?
        // Is it safe to iterate through this list and free my unmanaged resources?
        foreach(var ptr in _myUnmanagedResources)
        {
            Marshal.FreeHGlobal(ptr);
        }
    }
}

我的问题:是我的名单&lt; IntPtr&gt;对象&#39; safe&#39;使用,作为跟踪我分配的,非托管资源的方法?如果从终结器调用Dispose()怎么办?列表对象此时已经是GC了吗?如果是:有没有办法确保它将在最终确定期间存在?

1 个答案:

答案 0 :(得分:2)

列表&lt;&gt;班级本身不是一次性的,也没有终结者,所以你不会有任何问题。

然而,这并非完全安全,您无法防止行为不当的应用程序多次调用您的Dispose()方法或之后使用IntPtr。那当然会变得很糟糕。但是,解决起来非常简单,只需添加_myUnmanagedResources.Clear();

即可