如何正确释放OpenCvSharp.Mat的内存?
How to correctly release the memory of OpenCvSharp.Mat?
我必须调用 Dispose 函数吗?还是使用块使用?
如果是这样,我应该什么时候做?
在 DotNet 写作中,我不习惯考虑释放内存,所以我害怕犯错误而导致内存泄漏。
处置对象与内存没有任何关系。处置对象会释放其托管和非托管资源。非托管资源基本上是属于 OS 的资源,例如一个文件句柄。托管资源基本上是一个 .NET 对象,它本身拥有托管或非托管资源。当您处置一个 .NET 对象时,它可能会处置另一个 .NET 对象,该对象处置和释放非托管资源的其他 .NET 对象。
对支持它的对象调用 Dispose
没有特定要求,因为这样的对象将在某个时候由垃圾收集器完成并处理它。当您知道不再需要这些资源时,您最好显式释放这些资源。这意味着它们会更快地返回到 OS,并且 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
方法。这是释放托管资源的示例。
我必须调用 Dispose 函数吗?还是使用块使用? 如果是这样,我应该什么时候做? 在 DotNet 写作中,我不习惯考虑释放内存,所以我害怕犯错误而导致内存泄漏。
处置对象与内存没有任何关系。处置对象会释放其托管和非托管资源。非托管资源基本上是属于 OS 的资源,例如一个文件句柄。托管资源基本上是一个 .NET 对象,它本身拥有托管或非托管资源。当您处置一个 .NET 对象时,它可能会处置另一个 .NET 对象,该对象处置和释放非托管资源的其他 .NET 对象。
对支持它的对象调用 Dispose
没有特定要求,因为这样的对象将在某个时候由垃圾收集器完成并处理它。当您知道不再需要这些资源时,您最好显式释放这些资源。这意味着它们会更快地返回到 OS,并且 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
方法。这是释放托管资源的示例。