Как правильно освободить память OpenCvSharp.Mat?

Нужно ли вызывать функцию Dispose? Или использовать блок с помощью? И если да, то когда мне это делать? В написании DotNet я не удивляюсь, думая об освобождении памяти, поэтому я боюсь ошибиться и вызвать утечку памяти.

1 ответ

Решение

Удаление объекта не имеет ничего общего с памятью. Удаление объекта освобождает его управляемые и неуправляемые ресурсы. Неуправляемый ресурс - это в основном то, что принадлежит ОС, например дескриптор файла. Управляемый ресурс - это, по сути, объект.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 метод объекта, который его создал. Это пример освобождения управляемого ресурса.

Другие вопросы по тегам