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

C# 如何正确释放OpenCvSharp.Mat的内存?,c#,.net,vb.net,opencv,opencvsharp,C#,.net,Vb.net,Opencv,Opencvsharp,我必须调用Dispose函数吗?还是使用块使用? 如果是,我应该什么时候做? 在DotNet写作中,我不习惯考虑释放内存,因此我害怕犯错误并导致内存泄漏。处理对象与内存无关。处置对象将释放其托管和非托管资源。非托管资源基本上属于操作系统,例如文件句柄。托管资源基本上是一个.NET对象,它本身包含托管或非托管资源。当您处置一个.NET对象时,它可能处置另一个.NET对象,该对象处置一个非托管资源,而另一个.NET对象释放一个非托管资源 对于支持它的对象,您不需要调用Dispose,因为这样的对象将

我必须调用Dispose函数吗?还是使用块使用? 如果是,我应该什么时候做?
在DotNet写作中,我不习惯考虑释放内存,因此我害怕犯错误并导致内存泄漏。

处理对象与内存无关。处置对象将释放其托管和非托管资源。非托管资源基本上属于操作系统,例如文件句柄。托管资源基本上是一个.NET对象,它本身包含托管或非托管资源。当您处置一个.NET对象时,它可能处置另一个.NET对象,该对象处置一个非托管资源,而另一个.NET对象释放一个非托管资源

对于支持它的对象,您不需要调用
Dispose
,因为这样的对象将在某个时候由垃圾回收器最终确定,从而进行处理。当您知道不再需要这些资源时,最好显式地释放它们。这意味着它们将更快地返回到操作系统,并且GC可以更快地回收对象占用的内存

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

使用obj作为新的SomeDisposableType
'...
终端使用
相当于:

Dim obj作为新的SomeDisposableType
尝试
'...
最后
obj.Dispose()
结束尝试

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

一般来说,如果某个对象实现了
Dispose
方法,则需要释放该对象以释放其分配的资源。像
MemoryStream
这样的东西很少,它们的方法只是继承的结果,但也有一些这样的东西。
使用
/
使用
块只会为您进行处理。这是一个有点广泛,你可以(也应该)研究它的性质。非常感谢你的详细答案!如果我理解正确,我可以在一个函数中创建一个新的Mat实例,并确保GC在函数完成后调用Dispose函数。对吗?当对象不再被使用时,无论发生在哪里,您都会调用
Dispose
。如果我忘记了这样做,GC会在某个时候调用Dispose吗?是的,GC会在某个时候完成所有操作,作为一种保护措施,但如果可能的话,您不应该依赖于此。在我14年的.NET开发中,我只遇到过一个这样的例子。