我有以下 struct :

public struct BasicIndividualStruct
{
  public void Dispose()
  {
    path.Dispose();
  }

  public float fitness;
  public UnsafeList<float2> path;
}

public struct NativeBasicPopulation
{
  public void Dispose()
  {
    foreach(var individual in _population)
    {
      individual.Dispose();
    }
    _population.Dispose();
  }

  public NativeArray<BasicIndividualStruct> _population;
}

我是这样创建的:

    var population = new NativeArray<BasicIndividualStruct>(50, Allocator.TempJob);
    for (int i = 0; i < populationSize; i++)
    {
      var element = population[i];
      element.path = new Unity.Collections.LowLevel.Unsafe.UnsafeList<Unity.Mathematics.float2>(10, Allocator.TempJob);
      element.path.Resize(10);
      element.fitness = 0;
      population[i] = element;
    } 
    var pop = new NativeBasicPopulation()
    {
      _population = population
    };

我的问题是-工作结束后如何妥善处理?

NativeBasicPopulation中的_population只是本地pop变量的副本,因此我需要立即在pop上调用Dispose

NativeBasicPopulation::Dispose内部的循环真的会起作用吗?因为根据我的理解,给定循环中的individual只是数组中元素的副本.

推荐答案

The manual说:

本机容器是值类型,这意味着当它们被赋给一个变量时,Unity会复制NativeContainer struct ,该 struct 包含指向本机容器数据存储位置的指针,包括它的原子安全句柄.It doesn’t copy the entire contents of the NativeContainer.

这种情况意味着可能存在多个NativeContainer struct 副本,它们都引用相同的内存区域.

如果释放了NativeContainer,则NativeContainer struct 的所有副本都必须识别原始NativeContainer无效.

总而言之,您可以将一个NativeContainer实例赋给多个变量,但您只需要对其中一个变量调用Dispose.因此,对于您的问题,您不需要立即处置pop,但应该在作业(job)结束后处置您保存的对象.

Csharp相关问答推荐

在命令行中使用时安装,但在单击时不会安装

使用yaml将Azure函数代码部署到FunctionApp插槽时出现问题(zip未找到)

FileStream. FlushAsync()是否确保文件被写入磁盘?

使用命令初始化可绑定属性

C#DateTime.ToString在ubuntu和centos中返回不同的结果

如何测量在使用UTF8而不是C#中的UTF16编码字符串时内存使用量的增长

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

如何在C#中转换泛型包装类内部的派生类

DbContext-传递自定义配置选项

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

在implementationFactory中避免循环依赖

我可以查看我们向应用程序洞察发送了多少数据吗?

使用C#和.NET 7.0无法访问Cookie中的数据

此异步方法在重写方法中缺少等待运算符警告

Visual Studio 17.8.0制表符自动完成问题--三缩进

C#System.Commandline:如何向命令添加参数以便向其传递值?

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

HttpClient,上传文件时实现进度

C#If条件格式