If you have used IDisposable
, you will know the problem. It's very easy to "leak" them by forgetting to call Dispose()
on them. Yes, most objects' finalizers will eventually call Dispose()
, but it's a bad practice to rely on finalizer being run at all. It's cleaner and neater to Dispose()
of them at an appropriate time.
> EyeDisposable.exe C:\Projects\Foo\Foo.exe Instrumenting type `<Module>`... Instrumenting type `Foo`... Instrumenting type `Program`... - System.Void Foo.Program::Main(System.String[]): 1 newobjs; 0 disposes Instrumenting entry point... > EyeDisposable.exe C:\Projects\Foo\Bar.dll ...
> cd C:\Projects\Foo > Foo.exe
> type Foo.exe.DisposeLeaks.log ==== Disposer check 1 leaks detected! ==== Disposable object leaked! Hash code: 30015890 Type: Foo.Foo Created at: > [Foo.Program] Void Main(System.String[]) > [Foo.Program] Void EyeDisposable_NewMain(System.String[])
EyeDisposable uses Mono.Cecil to instrument assemblies. newobj
and Dispose()
calls are tallied and checked at the end of the program.
You need to update the Cecil submodule after cloning:
> git clone git://github.com/kizzx2/EyeDisposable.git > cd EyeDisposable > git submodule update
IDisposable
value types are not supported.