如何正确释放OpenCvSharp.Mat的内存?

时间:2018-02-04 19:18:42

标签: c# .net vb.net opencv opencvsharp

我是否必须调用Dispose函数?或者使用块? 如果是这样,我什么时候该做? 在DotNet写作中,我并不想考虑释放内存,因此我害怕犯错并导致内存泄漏。

1 个答案:

答案 0 :(得分:2)

处理对象与内存没有任何关系。处置对象会释放其托管和非托管资源。非托管资源基本上属于OS,例如,文件句柄。托管资源基本上是一个.NET对象,它本身拥有托管或非托管资源。当您处置.NET对象时,它可能会释放另一个.NET对象,该对象可以处理释放非托管资源的其他.NET对象。

您没有特别要求在支持它的对象上调用Dispose,因为这样的对象将在某个时刻由垃圾收集器完成并将处理它。当您知道不再需要这些资源时,您最好明确释放这些资源。这意味着它们可以更快地返回到操作系统,并且GC可以更快地回收对象占用的内存。

如果您创建了一个对象并且知道在同一范围内不再需要它,例如在同一个方法中,您应该使用Using语句创建它,以便它隐式地放置在块的末尾。即使抛出异常并且未在Using块内捕获,也可以保证发生处置。这样:

Using obj As New SomeDisposableType
    '...
End Using

相当于:

Dim obj As New SomeDisposableType

Try
    '...
Finally
    obj.Dispose()
End Try

如果仍然需要在块外部创建对象,则无法使用Using语句。在这种情况下,您应该尽力确定何时不再需要它,并在此时明确调用其Dispose方法。至少,您应该在创建它的对象的Dispose方法中调用其Dispose方法。这是一个发布托管资源的示例。

相关问题