gpt4 book ai didi

c# - 单元测试内存泄漏

转载 作者:可可西里 更新时间:2023-11-01 07:57:02 26 4
gpt4 key购买 nike

我有一个存在大量内存泄漏的应用程序。例如,如果打开一个 View 并将其关闭 10 次,我的内存消耗会增加,因为 View 没有完全清理。这些是我的内存泄漏。从测试驱动的角度来看,我想编写一个测试来证明我的泄漏,并且(在我修复泄漏之后)断言我修复了它。这样我的代码以后就不会被破坏。简而言之:

有没有办法断言我的代码没有从单元测试中泄漏内存?

例如我可以做这样的事情吗:

objectsThatShouldNotBeThereCount = MemAssertion.GetObjects<MyView>().Count;
Assert.AreEqual(0, objectsThatShouldNotBeThereCount);

我对分析不感兴趣。我使用 Ants 分析器(我非常喜欢),但也想编写测试以确保“泄漏”不会再出现

我正在使用 C#/Nunit,但我对任何对此有哲学的人感兴趣......

最佳答案

当托管类型不小心使用非托管资源时,通常会引入内存泄漏。

一个典型的例子是 System.Threading.Timer,它将回调方法作为参数。因为计时器最终使用非托管资源,所以引入了一个新的 GC 根,只能通过调用计时器的 Dispose 方法来释放它。在这种情况下,您的类型还应该实现 IDisposable,否则该对象永远不会被垃圾回收(泄漏)。

您可以通过执行与此类似的操作来为此场景编写单元测试:

var instance = new MyType();

// ...
// Use your instance in all the ways that
// may trigger creation of new GC roots
// ...

var weakRef = new WeakReference(instance);

instance.Dispose();
instance = null;

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Assert.IsFalse(weakRef.IsAlive);

关于c# - 单元测试内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3652028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com