在我向像以下这样的建筑商提出例外时是否有任何记忆泄露?
class Victim
{
public string var1 = "asldslkjdlsakjdlksajdlksadlksajdlj";
public Victim()
{
//throw new Exception("oops!");
}
}
垃圾收集器是否收集了未爆炸物品?
在我向像以下这样的建筑商提出例外时是否有任何记忆泄露?
class Victim
{
public string var1 = "asldslkjdlsakjdlksajdlksadlksajdlj";
public Victim()
{
//throw new Exception("oops!");
}
}
垃圾收集器是否收集了未爆炸物品?
一般来说,从不泄露记忆的角度来看,这是安全的。 但是,如果你分配这种类型的未经管理的资源,将建筑商的例外情况排除在外是危险的。 举以下例子:
public class Foo : IDisposable {
private IntPtr m_ptr;
public Foo() {
m_ptr = Marshal.AllocHGlobal(42);
throw new Exception();
}
// Most of Idisposable implementation ommitted for brevity
public void Dispose() {
Marshal.FreeHGlobal(m_ptr);
}
}
每次你试图制造时,哪怕是使用一环,都会泄露记忆。 例如,这种泄漏记忆。
using ( var f = new Foo() ) {
// Won t execute and Foo.Dispose is not called
}
如果你没有产生未经管理的资源,就应当对施工者的例外情况加以处罚。 然而,如果你确实在建筑商中制造了未经管理的资源,则该建筑商的整体,包括投掷石块,应划入一个审判/渔获物。 偷盗JardedPar大举:
public class Foo : IDisposable {
private IntPtr m_ptr;
public Foo() {
try
{
m_ptr = Marshal.AllocHGlobal(42);
throw new Exception();
}
catch
{
Dispose();
throw;
}
}
// Most of Idisposable implementation ommitted for brevity
public void Dispose() {
Marshal.FreeHGlobal(m_ptr);
}
}
现在的工作如下:
using ( var f = new Foo() ) {
// Won t execute, but Foo still cleans itself up
}
是的,垃圾收集器将收回已经分配给该物体的管理资源。 如果你开始开发任何未管理的资源,你将需要以正常方式清理这些资源。
这取决于你在例外情况出现之前提出的其他资源。 我不认为在建筑商中出现例外是巨大的,但把他们扔到定稿者或处置者中的情况则更糟。