Bar*_*rka 1 c# dispose memory-leaks memory-management resource-management
static StreamWriter我班上有一个变量:
private static StreamWriter streamWriter = CreateStreamWriter(pathToFile);
Run Code Online (Sandbox Code Playgroud)
我没有在我的应用程序中关闭此StreamWriter,因为它需要在应用程序运行时打开.
如果我多次启动和停止此应用程序,是否会出现内存泄漏?或者关闭应用程序后对象是否正确处理?
此类是ASP.NET MVC 4和WPF应用程序使用的实用程序类.
感谢大家的回复.这是我添加的代码:
在包含StreamWriter的类中:
public static void OnApplicationExit(object sender, EventArgs e)
{
try
{
streamWriter.Flush();
streamWriter.Close();
streamWriter.Dispose();
}
catch { }
}
public static void OnApplicationExit()
{
try
{
streamWriter.Flush();
streamWriter.Close();
streamWriter.Dispose();
}
catch { }
}
Run Code Online (Sandbox Code Playgroud)
在ASP.NET MVC Global.Asax中:
protected void Application_End()
{
Utilities.MyClass.OnApplicationExit();
}
Run Code Online (Sandbox Code Playgroud)
如果我多次启动和停止此应用程序,是否会出现内存泄漏?
不可以.当流程结束时,与流程关联的所有资源都会自动返回到操作系统.这是Windows的一个功能; 所有流程都是如此,而不仅仅是托管代码流程.
正如其他人指出的那样,您可能会丢失数据,但不会泄漏内核对象.
是关闭应用程序时正确处理的对象?
不必要.如果应用程序被"快速失败"终止,那么显然没有终结器运行,因为没有运行.如果应用程序被未处理的异常终止,那么它是否是实现定义的终结器是否运行.
此外,正如Raymond Chen曾经指出的那样,当你知道这个过程被关闭时,运行终结器就像在拆除建筑物之前扫地.这是浪费时间和精力.
简而言之,您不应该依赖终结器来运行程序的正确性.