【发布时间】:2016-04-26 18:11:30
【问题描述】:
我有一个内部管理 IBuffer 的类。数据是敏感的,所以我想让类确保缓冲区在被销毁之前为 0,以避免将这些位留在内存中。我有一个 Erase() 方法,如下所示:
public static void Erase(this IBuffer value)
{
using (var writer = new DataWriter(value.AsStream().AsOutputStream()))
{
for (int i = 0; i < value.Length; i++)
writer.WriteByte(0);
var storeTask = Task.Run(async () => await writer.StoreAsync());
storeTask.Wait();
}
}
首先,我认识到我在这里使用 Task.Run 来调用非 CPU 绑定的异步方法是可疑的,但我还没有找到同步的等效方法。欢迎使用替代品。
我遇到的问题是,在调试模式下,并且大部分时间在发布模式下,它都能完美运行。但是,偶尔在 Release 模式下,在我的对象上运行 Finalize() 时会遇到异常:
System.Runtime.WindowsRuntime.dll 中出现“System.Runtime.InteropServices.InvalidComObjectException”类型的未处理异常
附加信息:Excep_InvalidComObject_NoRCW_Wrapper。欲了解更多信息,请访问http://go.microsoft.com/fwlink/?LinkId=623485
该网址实际上只谈论 .Net Native 中的异常优化,而不是这种特定的异常类型。
我认为原因可能与在我的 Erase 方法有机会完成之前被销毁的 IBuffer 有关。
我怎样才能正确地实现我想要的行为?
【问题讨论】:
-
使用
IDisposable,而不是终结器。 -
但这不是要求类的使用者显式调用 Dispose 吗?那不是我想要的行为。 IDisposable 的文档说“你应该重写 Object.Finalize 以在消费者忘记调用 Dispose 的情况下释放非托管资源。”其中 Object.Finalize 在 C# 中通过实现析构函数被覆盖。
-
如果您的课程处理不应保留在内存中的秘密,您的调用者需要显式调用
Dispose(通过using)。 不要依赖 GC 销毁内存.
标签: c# destructor uwp