这是内存泄漏吗?请检查下面的代码

时间:2014-06-26 06:41:47

标签: .net vb.net memory-leaks

在我的VB应用程序中,我使用数据集如下:

Dim rs As DataSet
Dim sql As String = "some sql"
rs = GetDataSet(sql, db)
' Work with the data

sql = "another sql"
rs = GetDataSet(sql, db)
' More code

rs.Dispose

如果我在sub的末尾添加一个dispose,或者我应该在每次使用它之后处理rs会导致内存泄漏吗?

1 个答案:

答案 0 :(得分:0)

嗯,"内存泄漏的问题"在.NET中,它们与使用直接内存管理的语言(如C / C ++)不同。在.NET中,泄漏的内存几乎总是从一个垃圾收集器根引用对象的结果,该对象是由图中对象之间严重管理的依赖关系引起的,而不是缺少内存释放。

从技术上讲,没有丢弃一次性对象没有任何问题,应用程序甚至可以在不调用Dispose的情况下运行良好。

虽然我的文章http://alexatnet.com/articles/memory-leaks-in-net-applications中有一些很好的.NET内存泄漏示例,但它缺少一个简单的例子 - 在对象数据由两部分组成的情况下缺少Dispose - 微小的托管包装器大量非托管数据(换句话说,像图像一样)。想象一下,应用程序会创建多个图像,并且在不再需要它们时不会将它们丢弃。在这种情况下,GC不会收集垃圾并销毁图像,因为GC阈值未被命中,图像会快速消耗所有可用虚拟内存并导致应用程序崩溃。

考虑相反的 - 相当大的.NET对象和微小的非托管资源,如小型COM对象。在这种情况下,即使未明确调用Disposed,密集使用这些对象也会经常调用GC来清理所有未手动处理的对象,并且永远不会出现OutOfMemory异常。

这就是为什么很难判断你的代码示例是否包含"内存泄漏"或者,更准确地说,它会引起麻烦吗?

示例本身并不准确,很明显第一个对象没有被处理掉。如果它主要由托管对象组成,它不会引起麻烦 - 代码看起来不太好。如果它有大量非托管数据(BLOBS或其他东西),那么它最终可能会使您的应用程序崩溃。

因此,如果您想确定,请使用"使用"重写它。 http://msdn.microsoft.com/en-GB/library/htd05whh.aspx。如果你喜欢exreme并认为你的生活过于简单而没有及时调试OutOfMemory问题 - 只要保持原样。

对于这么简单的问题,我很抱歉。