是否可以使用托管列表安全地跟踪非托管资源

本文关键字:跟踪 资源 列表 可以使 是否 安全 | 更新日期: 2023-09-27 18:34:39

假设我有一个一次性类,它使用 List 来跟踪非托管资源:

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);
        }
    }
}

我的问题:我的 List 对象是否可以"安全"使用,作为跟踪已分配的非托管资源的一种手段? 如果从终结器调用 Dispose(( 怎么办? 此时列表对象是否已经进行了GC处理? 如果是:有没有办法确保它在最终确定期间存在?

是否可以使用托管列表安全地跟踪非托管资源

列表<>类本身不是一次性的,也没有终结器,所以你没有任何问题。

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