Как правильно освободить память 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
метод объекта, который его создал. Это пример освобождения управляемого ресурса.