/// <summary> /// Releases unmanaged and - optionally - managed resources /// </summary> /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> /// <msdn-id>ms682317</msdn-id> /// <unmanaged>IUnknown::Release</unmanaged> /// <unmanaged-short>IUnknown::Release</unmanaged-short> protected unsafe override void Dispose(bool disposing) { // Only dispose non-zero object if (NativePointer != IntPtr.Zero) { // If object is disposed by the finalizer, emits a warning if (!disposing && Configuration.EnableTrackingReleaseOnFinalizer) { if (!Configuration.EnableReleaseOnFinalizer) { var objectReference = ObjectTracker.Find(this); LogMemoryLeakWarning?.Invoke(string.Format("Warning: Live ComObject [0x{0:X}], potential memory leak: {1}", NativePointer.ToInt64(), objectReference)); } } // Release the object if (disposing || Configuration.EnableReleaseOnFinalizer) { ((IUnknown)this).Release(); } // Untrack the object if (Configuration.EnableObjectTracking) { ObjectTracker.UnTrack(this); } // Set pointer to null (using protected members in order to avoid NativePointerUpdat* callbacks. _nativePointer = (void *)0; } base.Dispose(disposing); }
private void Dispose(bool disposing) { if (_nativePointer != IntPtr.Zero) { if (_isOwner) { if (!disposing) { LogMemoryLeakWarning?.Invoke($"Warning: potential memory leak: [0x{_nativePointer:X}]"); } DisposeNative(); #if DEBUG if (_nativePointer != IntPtr.Zero) { throw new FFmpegException($"_handle should reset in {nameof(DisposeNative)}."); } #endif } _nativePointer = IntPtr.Zero; } }