如何在C#/ .NET中创建内存泄漏

时间:2011-07-04 06:14:52

标签: c# .net memory-leaks

  

可能重复:
  Is it possible to have a memory leak in managed code? (specifically C# 3.0)
  Memory Leak in C#

昨天有一个类似的问题,但是对于Java,所以我很感兴趣 - 在C#/ .NET中创建内存泄漏需要什么(不使用不安全的)?

3 个答案:

答案 0 :(得分:12)

静态事件;最后,因为他们永远不会超出范围。

static event EventHandler Evil;

for(int i = 0 ; i < 1000000 ; i++)
    Evil += delegate {};

匿名方法在这里只是一个很好的方法但很好,因为他们是取消订阅的猪,除非你将副本带入变量/字段并订阅 < / em>的

技术上这实际上并没有“泄露”,因为您仍然可以通过Evil.GetInvocationList()访问它们 - 但是,当与常规对象一起使用时,这会导致意外的对象生命周期,即

MyHeavyObject obj = ...
...
SomeType.SomeStaticEvent += obj.SomeMethod;

现在obj的对象永远存在。这足以满足感知泄漏 IMO,并且“我的应用程序死于可怕的死亡”对我来说已经足够了; p

答案 1 :(得分:5)

当一个对象订阅一个事件时,暴露该事件的对象会维护对该订阅者的引用(实际上,该事件,MultiCastDelegate最初会执行,但它会继续执行)。如果对订户的最后一次引用(除了由event维护的那个)超出范围,则此参考将阻止订户进行GC。

另外两个答案完全落后并且不正确。这在一个简单的示例中显示有点棘手,通常在较大的项目中看到,但请记住MultiCastDelegateevent维护对订阅者的引用)你应该能够思考它。

编辑:正如Marc在他的回复中提到的,你可以在技术上通过GetInvocationList()方法获得对“泄露”对象的引用,但是你的代码不太可能使用它,当你崩溃时无关紧要使用OutOfMemoryExcetion

答案 2 :(得分:1)

从安全托管代码中抽象出直接内存访问。必须在某处调用不安全的代码,以便在您编写的代码或第三方资源(可能在FCL中)内存泄漏错误中导致内存泄漏。