gpt4 book ai didi

c# - 关于位图、图像和 `using` block 的一些疑问

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:04 24 4
gpt4 key购买 nike

我遇到了这个问题。

Garbage Collector not doing its job. Memory Consumption = 1.5GB & OutOFMemory Exception

感觉自己的理解有问题。请澄清这些事情。

  1. DestructorIDisposable.Dispose 是释放不受 .NET 控制的资源的两种方法。这意味着,除了内存之外的一切。对吧?
  2. 使用 block 只是调用对象的IDisposable.Dispose() 方法的更好方式。

这是我指的主要代码。

class someclass
{
static someMethod(Bitmap img)
{
Bitmap bmp = new Bitmap(img); //statement1
// some code here and return
}
}

这是我用于测试的类:

class someotherClass
{
public static voide Main()
{
foreach (string imagePath in imagePathsArray)
{
using (Bitmap img1 = new Bitmap(imagePath))
{
someclass.someMethod(img1);
// does some more processing on `img1`
}
}
}
}

statement1 是否存在内存泄漏?

问题 1:假设每张图片大小为 10MB。那么这个 bmp 对象是否至少占用 10MB?我的意思是,它会制作整个图像的全新副本吗?或者只是引用它?

问题 2:我应该还是不应该将 statement1 放在 using block 中?

我的论点:我们不应该。因为 using 不是为了释放内存而是为了释放资源(在这种情况下是文件句柄)。如果我在 using block 中使用它。它在此处关闭由此 bmp 对象封装的文件句柄。这意味着我们也正在关闭文件句柄对于调用者的 img1 对象。哪个不正确?

截至内存泄漏。不,这里没有内存泄漏的范围。因为引用 bmp 在返回此方法时被销毁。这使得它引用的内存没有任何指针。所以,它的垃圾被收集了。我说得对吗?

编辑:

class someclass
{
static Bitmap someMethod(Bitmap img)
{
Bitmap bmp = new Bitmap(img); //can I use `using` block on this enclosing `return bmp`; ???
// do some processing on bmp here
return bmp;
}
}

最佳答案

您将内存等同于托管资源,这根本不是一回事。

如果您创建了一个实现了IDisposable 类型的新对象,您应该在使用完成后将其释放。期间。

事情的真相是,除非你用 Reflector 之类的东西反汇编 Bitmap 类,否则你不会知道它如何处理传入其构造函数的另一个实例,或者它的 Dispose 方法确实如此。包含 IDisposable 接口(interface)应该被视为来自类开发人员的指令,在您完成它时调用 Dispose 方法。您之前的问题说您正在观察内存泄漏;我们已经指出您并没有处理所有内容 - 您是否尝试添加我们建议的处理调用并查看内存泄漏问题是否已解决?

关于c# - 关于位图、图像和 `using` block 的一些疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2560512/

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