c# - 使用 block 从内部返回一次性对象

标签 c# memory-management .net-4.0 memory-leaks using

我注意到在分析我的程序时,很多 byte[] 卡在了内存中。我做了一些挖掘,发现大多数实例都是以这样的方式创建的:

public byte[] CreateBytes(byte[] bytes)
{
    using (var start = new MemoryStream()) 
    {
        using (var memStr = new MemoryStream(bytes))
        {
            //do stuff
            return start.ToArray();
        }
    }
}

返回的 byte[] 然后被传递给其他方法,并用于从另一个使用 block 中创建另一个 MemoryStream:

using (var uncompressedStream = new MemoryStream(uncompressedData))
{
    using (var compressedStream = new MemoryStream())
    {
        //Do some compression
    }
}

myObject.Bytes = uncompressedData;
uncompressedData = null;

return myObject;

(uncompressedData 是从 CreateBytes() 返回的值)。

我的问题是,byte[] 何时被清理?我是否特别需要将其设置为 null,如果是,在哪里?在第二次 using block 之后我不再需要它,但是如果我简单地放置 uncompressedData = null; 我不确定这是否会回收内存。

我原以为 CreateBytes(byte[] bytes) 中的 using 语句会处理字节,但由于它返回一个引用,因此会推迟和/或放弃处理?

编辑:我添加了另一行代码。由于我将 uncompressedBtyes 存储在另一个对象中,将 uncompressedData 设置为 null 是没有意义的,并且 byte[] 将在 myObject 期间存在(或直到 myObject.Bytes 被设置为 null),正确吗?

最佳答案

当两个条件都满足时,byte[] 被清除:

  • 没有对该内存块的引用
  • 垃圾收集器决定收集那个内存块

基于多种因素,GC 在不确定的时间运行。

关于c# - 使用 block 从内部返回一次性对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12186319/

相关文章:

c# - 是否可以在一行中编写 ROT13?

memory-management - Swift 协议(protocol)对象的 ARC

c - 为什么我要 free() 一个由 malloc() 分配的对象?

.net-4.0 - 如何在任务并行库中安排任务以供将来执行

c# - 如何在代码隐藏中访问aspx控件?

c# - 控制 'x' 从创建它的线程以外的线程访问

c# - 内存管理——我是否应该担心在状态机中调整长期存在的临时对象数组的大小?

.net - TcpClient - 如何确定何时传送字节?

c# - 我将如何更改事件处理程序在继承类中的工作方式?

c# - 插入和更新的 URI 约定 - WCF Rest API