【发布时间】:2010-11-29 19:18:52
【问题描述】:
我有一个类 (参见下面的示例),它充当 CUDA 内存结构的 .NET 包装器,
使用 cudaMalloc() 分配并使用 IntPtr 类型的成员字段引用。
(该类使用本机 C DLL 的 DllImport 封装了各种 CUDA 功能。)
dispose 方法检查指针是否为 IntPtr.Zero,如果不是则调用 cudaFree()
成功释放内存(返回 CUDA 成功)
并将指针设置为 IntPtr.Zero。
finalize 方法调用 dispose 方法。
问题是,如果调用 finalize 方法而之前没有调用 dispose,
然后 cudaFree() 函数设置“无效设备指针”的错误代码。
我检查了一下,cudaFree() 接收到的地址与 cudaMalloc() 返回的地址相同,并且之前没有调用过 dispose()。
当我添加对 dispose() 的显式调用时,相同的地址被成功释放。
我发现的唯一解决方法是不要从终结器调用 dispose 方法,但是,如果并不总是调用 dispose(),这可能会导致内存泄漏。
任何想法为什么会发生这种情况? - 在 Windows Vista 64 位 + GeForce 8800 和 Windows XP 32 位 + Quadro FX 上的 .NET 3.5 SP1 下,我在 CUDA 2.2 和 2.3 上遇到了同样的问题(不确定是哪个数字)。
【问题讨论】:
-
如果免费失败,我不会抛出异常。 MS 指南建议避免这种情况。
-
我只是补充说,以帮助调试问题,但是,由于某些未知原因,我在 VS 上工作的两台 PC 中的一台自动将返回代码视为异常,而我没有抛出一个!?跨度>
标签: .net interop idisposable cuda garbage-collection