假设我有一个使用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了吗?如果是:有没有办法确保它将在最终确定期间存在?
答案 0 :(得分:2)
列表&lt;&gt;班级本身不是一次性的,也没有终结者,所以你不会有任何问题。
然而,这并非完全安全,您无法防止行为不当的应用程序多次调用您的Dispose()方法或之后使用IntPtr。那当然会变得很糟糕。但是,解决起来非常简单,只需添加_myUnmanagedResources.Clear();