C# 解决C语言中内存泄漏的方法有哪些#

C# 解决C语言中内存泄漏的方法有哪些#,c#,.net,memory-leaks,garbage-collection,C#,.net,Memory Leaks,Garbage Collection,我在学C。据我所知,您必须正确设置,让垃圾收集器实际删除所有应该删除的内容。我在寻找多年来从你身上学到的智慧,聪明的人 我来自C++背景,非常习惯于代码和开发模式。我想了解C#中的代码味道。给我建议 删除内容的最佳方法是什么 你怎么知道你什么时候有“内存泄漏” 编辑:我正在尝试制定一份“内存管理需要经常做的事情”的剩余工作清单 非常感谢 删除内容的最佳方法是什么 注意:以下仅适用于包含非托管资源的类型。它对纯托管类型没有帮助 也许最好的方法是实现并遵循IDisposable模式;并对实现它的

我在学C。据我所知,您必须正确设置,让垃圾收集器实际删除所有应该删除的内容。我在寻找多年来从你身上学到的智慧,聪明的人

我来自C++背景,非常习惯于代码和开发模式。我想了解C#中的代码味道。给我建议

删除内容的最佳方法是什么

你怎么知道你什么时候有“内存泄漏”


编辑:我正在尝试制定一份“内存管理需要经常做的事情”的剩余工作清单


非常感谢

删除内容的最佳方法是什么

注意:以下仅适用于包含非托管资源的类型。它对纯托管类型没有帮助

也许最好的方法是实现并遵循IDisposable模式;并对实现它的所有对象调用dispose方法

“使用”语句是你最好的朋友。粗略地说,它将在实现IDisposable的对象上为您调用dispose。

C#,.NET Framework使用托管内存,所有内容(分配的非托管资源除外)都是垃圾收集的


可以安全地假设托管类型始终是垃圾收集的。这包括
数组
结构
。随意做
int[]stuff=newint[32]并忘记它

如果在类中打开文件、数据库连接或任何其他非托管资源,请实现IDisposable接口,并在Dispose方法中取消分配非托管资源

任何实现IDisposable的类都应该显式关闭,或者使用类似块的方法(我认为很酷)使用

using (StreamReader reader = new StreamReader("myfile.txt"))
{
   ... your code here
}

这里.NET将在超出{}范围时处理读卡器。

GC的第一件事是它是不确定的;如果您希望及时清理资源,请实施
IDisposable
并使用
using
;这不会收集托管内存,但对非托管资源和后续链有很大帮助

特别要注意的是:

  • 大量固定(对GC的功能有很多限制)
  • 很多终结器(您通常不需要它们;降低GC的速度)
  • 静态事件-保持大量大型对象图活动的简单方法-p
  • 在廉价长寿命对象上的事件,可以看到本应清理的昂贵对象
  • “捕获变量”意外地使图形保持活动状态

用于调查内存泄漏。。。“SOS”是最简单的路线之一;您可以使用SOS查找一个类型的所有实例,以及可以看到它的内容等。

一般来说,您越不担心C#中的内存分配,您的情况就越好。当我在收集方面遇到问题时,我会让档案员告诉我

<>你不能用C++中的方法和C一样创建内存泄漏。垃圾收集器将始终“支持你”。您可以做的是创建对象并保留对它们的引用,即使您从未使用它们。这是一种需要注意的代码气味

除此之外:

  • 了解收集的频率(出于性能原因)
  • 对对象的引用保留的时间不要超过需要的时间
  • 一旦处理完实现IDisposable的对象,就立即将其处理掉(使用
    语法)
  • 正确实施

    • 您可以使用一些工具,比如学习如何正确使用它需要一些时间,但毕竟它是免费的。(它多次帮助我发现内存泄漏)

      我能想到的内存泄漏的主要来源是:

      • 保留对不再需要的对象的引用(通常是在某种类型的集合中),因此这里您需要记住,添加到集合中的所有引用也将保留在内存中

      • 具有循环引用,例如让代表在活动中注册。因此,即使您显式地不引用对象,也无法对其进行垃圾收集,因为它的一个方法已注册为带有事件的委托。在这些情况下,您需要记住在放弃引用之前删除委托

      • 与本机代码互操作但未能释放本机代码。即使使用实现终结器的托管包装器,CLR通常也不会足够快地清理它们,因为它不了解内存占用。您应该使用using(IDisposable){}模式

      • < >内存管理的另一件事是,如果您正在实现任何观察者模式,而不正确地处理引用。p> 例如: 对象A监视对象B 对象B被释放如果从A到B的引用未被释放,则GC将不会正确地释放该对象。由于事件处理程序仍然被分配,GC不会将其视为未使用的资源

        如果你有一小组你正在使用的对象,这可能与我无关。但是,如果您使用数千个对象,这可能会在应用程序的整个生命周期中导致内存逐渐增加

        有一些很棒的内存管理软件应用程序可以监视应用程序堆的运行情况。我发现使用.Net内存分析器有很大的好处


        HTH

        我建议使用

        .NET内存探查器是一个功能强大的工具,用于在用C#、VB.NET或任何其他.NET语言编写的程序中查找内存泄漏并优化内存使用

        .NET内存探查器将帮助您:

        • 查看实时内存和资源信息
        • 通过收集和比较.NET内存快照,轻松识别内存泄漏
        • 查找未正确处理的实例
        • 获取有关非托管资源使用情况的详细信息<