不会丢弃的静态变量

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)

Eri*_*ert 5

如果我多次启动和停止此应用程序,是否会出现内存泄漏?

不可以.当流程结束时,与流程关联的所有资源都会自动返回到操作系统.这是Windows的一个功能; 所有流程都是如此,而不仅仅是托管代码流程.

正如其他人指出的那样,您可能会丢失数据,但不会泄漏内核对象.

是关闭应用程序时正确处理的对象?

不必要.如果应用程序被"快速失败"终止,那么显然没有终结器运行,因为没有运行.如果应用程序被未处理的异常终止,那么它是否是实现定义的终结器是否运行.

此外,正如Raymond Chen曾经指出的那样,当你知道这个过程被关闭时,运行终结器就像在拆除建筑物之前扫地.这是浪费时间和精力.

简而言之,您不应该依赖终结器来运行程序的正确性.