示例#1
0
        /// <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;
            }
        }