【发布时间】:2023-03-10 16:04:01
【问题描述】:
我知道如何在课堂上使用IDisposable 接口。但是,我不知道如何释放由我的类变量分配的内存?例如,在我的课堂上,我创建了一个List<Bitmap>,列表中有 500 个位图图像,我正在 dispose 方法中清除此列表。但是,当我使用GC.GetTotalMemory() 获取总内存时,它显示相同的结果。
在这里,我创建了一个由IDisposable 接口实现的示例类。
public class disposable : IDisposable
{
List<Bitmap> list = new List<Bitmap>();
public disposable()
{
for (int i=0; i< 500; i++)
{
Bitmap bmp = new Bitmap(1024,768);
using (Graphics g = Graphics.FromImage(bmp))
{
g.FillRectangle(Brushes.Red, new Rectangle(0,0,1024,768));
}
list.Add(bmp);
}
}
public void Dispose()
{
list.Clear();
list = null;
}
}
然后我执行了以下代码
static void Main(string[] args)
{
long l1 = GC.GetTotalMemory(true);
using (disposable d = new disposable())
{
//nothing to do
}
long l2 = GC.GetTotalMemory(false);
Console.WriteLine(l1.ToString());
Console.WriteLine(l2.ToString());
Console.ReadKey();
}
输出说。
181764 //bytes before creating object of disposable class
222724 //bytes after creating object of disposable class
然后我尝试了不使用 using 关键字的简单声明。
Dim d As New disposable();
但是,它给了我同样的结果。
所以,我的问题是为什么即使我处置了对象,这些位图图像分配的内存也没有释放。它没有任何区别。我正在清除列表中的所有项目,并将空值分配给 list 对象。
我也尝试过声明字节数组而不是 list<Bitmap> 和 SqlConnection 对象。
但是,它没有显示两种方法(简单声明和using 语句)之间分配的总内存有任何差异。
long l1 = GC.GetTotalMemory(true);
//SqlConnection cnn = new SqlConnection(""); //1st Method
using (SqlConnection cnn = new SqlConnection("")) //2nd Method
{
//nothing to do
}
long l2 = GC.GetTotalMemory(false);
Console.WriteLine(l1.ToString());
Console.WriteLine(l2.ToString());
我不明白为什么它不清除托管和非托管对象分配的内存?
【问题讨论】:
-
IDisposable 有两种模式,描述在这里:msdn.microsoft.com/en-us/library/… 我建议你,直到你非常好,你遵循它们。
-
谢谢@xanatos,我会的:)
标签: c# memory-management idisposable