【问题标题】:Do I need to clear Byte[]?我需要清除 Byte[] 吗?
【发布时间】:2021-10-23 15:52:31
【问题描述】:

在我的游戏中,用户可以从图库中选择多个图像并将它们加载到游戏中。我创建了一个从文件路径获取图像的函数。在那个函数中,我声明了局部变量 byte[]。所以在读取文件后,我需要将该字节 [] 释放到释放的内存中。这是我的代码:

if (File.Exists(filePath)) 
{
    byte[] fileData = File.ReadAllBytes(filePath);
    Texture2D tex = new Texture2D(2, 2);
    tex.LoadImage(fileData);
}

从 byte[] 加载纹理后是否需要清除 byte[] ????用户可以从图库中选择任何图像文件,因此没有文件大小限制。

【问题讨论】:

  • Do I need to clear byte[] after texture is loaded from byte[]
  • 由于byte[] 没有实现 IDisposable没有Dispose(清除、释放、免费等) ) 它。 byte[] 分配的内存将由 Garbage Collector (GC) 释放。
  • so there is no limit of filesize .. 是的 .. 默认情况下,一个数组最多可以有int.MaxValue 元素;)所以如果大约 2GB 无论如何都不能填满你设备的内存,那么最新的c# 本身就有有问题^^

标签: c# unity3d memory-management memory-leaks garbage-collection


【解决方案1】:

简短回答:否

byte[] 是托管资源。它会被 GC 彻底清理掉。

文件相关的类通常涉及非托管资源——通常是操作系统文件句柄。但是File.ReadAllBytes(string) 似乎遵循了我的建议“创建、使用、处置。所有这些都在同一段代码中,最好使用 using 语句。”所以我预计不会出现问题。

Networking 和 DB 类涉及未管理的资源 - 通常是网络连接。

许多与绘图相关的类使用非托管资源 - 主要是一些非托管内存以提高性能。

但这只是一个字节[]。与任何 int[] 一样管理。请注意,由于bytearray 都没有实现 IDisposeable,所以无论如何您都没有选择的余地。如果你尝试处理它,编译器会想知道你在说什么,因为没有这样的函数。

【讨论】:

  • 好吧,所以没有必要调用 GC.Collect(): 对吗???
  • @Jaimin 你不应该在生产代码中调用GC.Collect()。它用于修复错误,而不是生产代码。 |如果您遇到人为 GC 导致的延迟问题,请更改 GC 模式 - 不要到处手动收集。
  • You should never call GC.Collect() in production code. 这太简单了。更准确的说法是“打电话GC.Collect 是个好主意”。 docs.microsoft.com/en-us/archive/blogs/ricom/…
  • @mjwills 如果你必须打电话给GC.Collect(),有三种选择: 1. 你正在修复错误。 2. 你一开始就选择了错误的 GC 模式。 3. 你正在做实时编程,而 GC 内存管理方法是错误的起点。 |如果我看到它,那充其量只是一个笨拙的工作。
  • 我会让你和 Rico @Christopher 一起讨论这个问题。 可能你比他更了解这个问题吗?当然。 可能吗?嗯……
猜你喜欢
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
相关资源
最近更新 更多