链式调用可能会导致内存泄漏?

问题描述 投票:0回答:1

在链式调用中,存在中间产品。如果有一个继承自IDisposable的中间产品,那么通常我们应该使用using使其自动释放。但我在链式调用中忽略了这一点,只使用了一个using来释放我最终需要的资源对象。那么这会导致内存泄漏吗?

根据我的实际测试:将链式调用分成多行执行,并使用using修改其中的所有资源对象(不仅仅是最后一行)。对比前后的内存使用情况,确实存在内存泄漏。想请教一下大家有没有遇到过这种情况。这种内存泄漏好像比较容易发生。

c# memory-leaks
1个回答
0
投票
这种内存泄漏似乎是比较容易发生的。

是的,确实如此,是的,如果您有一个控制某些非托管资源的

IDisposable
对象,并且您不会在其上调用
Dispose
(手动或通过
using
),那么您将遇到内存泄漏,除非您有终结器定义:

终结器(历史上称为析构函数)用于在垃圾收集器收集类实例时执行任何必要的最终清理。

因此,在此类代码上使用一些流畅的类似 API 的调用是危险的。例如下面的代码:

var result = CreateSomeInstWithUnmanagedResource()
    .TransformThenInstanceWithoutCapture();

如果

TransformThenInstanceWithoutCapture
不使用
CreateSomeInstWithUnmanagedResource
创建的非托管资源处置传入实例,则资源将不会被处置。

尽管出于多种原因不建议依赖终结器,例如由于非确定性调用(您不知道 GC 何时运行)启动以及终结对象的生命周期延长。

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.