使用Directory.GetDirectories()可能会发生潜在的内存泄漏吗?

时间:2018-01-16 01:24:04

标签: c# memory-leaks

foreach (string path in mainFolders)
    {
        if (!Directory.Exists(path))
            continue;

        Stack<string> pathsToCheck = new Stack<string>(Directory.GetDirectories(path));

        while (pathsToCheck.Count > 0)
        {
            try
            {
                string cPath = pathsToCheck.Pop();
                string[] dir = Directory.GetDirectories(cPath);

                if (dir.Length > 0)
                    foreach (string s in dir)
                        pathsToCheck.Push(s);
                else
                    folderPaths.Add(cPath.Replace('\\', '/'));
            }
            catch (Exception e)
            {
                errors.Add(e.Message);
            }
        }
    }

所以基本上我要做的是获取文件夹路径列表并从中获取所有子目录。有时这似乎导致内存使用量超过9GB(如任务管理器所述),虽然可以检查大量文件夹(我检查的大多数是45,000个文件夹)但仍然是相对少量的内存。 / p>

那么有什么不对劲我没有抓到那可能会泄漏那么多记忆吗?我这样做是因为只要Directory.GetDirectories()遇到它无法读取的文件夹就会失败。我正在使用Unity并且坚持使用.NET 2.0。

1 个答案:

答案 0 :(得分:1)

我的一个小小的烦恼是错误的异常处理。你的可以吞下致命的例外,这是异常处理的致命罪。他经常链接两篇文章:

http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET

首先,您无法使用任务管理器进行内存测量。这些值不那么无用:http://www.itwriting.com/dotnetmem.php

其次,在尝试调试假定的内存泄漏之前,您需要了解GC的工作原理。特别是如果可能的话,它将尝试避免运行直到应用程序关闭: https://social.msdn.microsoft.com/Forums/en-US/286d8c7f-87ca-46b9-9608-2b559d7dc79f/garbage-collection-pros-and-limits?forum=csharpgeneral

.NET中只有少数可能的内存泄漏情况:

  • 你在集合中添加了一些东西,但是忘了以后再把它拿出来。此内存泄漏仅在运行时发生,因为应用程序关闭仍将清除所有内容
  • 您正在处理非托管的资源,而该班级的作者搞砸了Dispose/Fianlize模式。处置是强制性的。为了方便起见,Finalize是一个可选的东西。