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
IDisposablevalue types are not supported.