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

标签 c# .net vb.net opencv

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

最佳答案

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

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

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

Using obj As New SomeDisposableType
    '...
End Using

等同于:

Dim obj As New SomeDisposableType

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

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

关于c# - 如何正确释放OpenCvSharp.Mat的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48612057/

相关文章:

vb.net - N替换并模拟对象以触发事件

c# - 为什么 DateTime.ParseExact 不适用于美国以外的这个示例?

c# - System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo() 处的 FileNotFoundException

javascript - 需要只允许有效页码的正则表达式,例如 1、2、3、4-5,每个页码的最大长度为 3 位数字 (1-999)

c# - 是否可以在单个 Visual Studio Windows 控制台项目中混合使用 .cs (C#) 和 .fs (F#) 文件? (。网)

xml - 如何返回动态 XML 文件以在 VB.net 中使用

c# - Entity Framework : Database. ExecuteSqlCommand 方法

c# - 是否有将阿拉伯语 html 转换为 pdf 的免费组件?

c# - 使用 FSharp 获取有关 MongoDB 集合的一般信息

vb.net - 为什么 VB.net 类中的可空公共(public)属性不接受 0(零)作为赋值?