Are there any memory leaks when I throw an exception from a constructor like the following?
class Victim
{
public string var1 = "asldslkjdlsakjdlksajdlksadlksajdlj";
public Victim()
{
//throw new Exception("oops!");
}
}
Will the failing objects be collected by the garbage collector?
It depends on what other resources you've aquired before the exception is thorwn. I don't think throwing exceptions in a constructor is great, but throwing them in finalizers or dispose() is much much worse.
Throwing exceptions from a constructor should be fine if you have created no unmanaged resources. However, if you do create unmanaged resources in the constructor, the whole body of that constructor, including throws, should be wrapped in a try/catch. To steal JaredPar's great example:
The following would now work:
Funny, because I helped with a similar question just yesterday.
It's a bigger issue if you have a derived type, because some parts of the derived type will initialize but not others. From a memory perspective it doesn't really matter, because the garbage collector knows what's where. But if you have any unmanaged resources (implement IDisposable) things can get murky.
Yes, the garbage collector will reclaim the managed resources already allocated in the object. If you've initialised any unmanaged resources, you will need to clean those up yourself in the normal way.
In general this is safe from the perspective of not leaking memory. But throwing exceptions from a constructor is dangerous if you allocate unmanaged resources in the type. Take the following example
This class will leak memory every time you try to create even if you use a using block. For instance, this leaks memory.