Delphi 从指针复制数据?

Delphi 从指针复制数据?,delphi,pointers,copy,record,Delphi,Pointers,Copy,Record,我有pDataSource:PAnalyzeInfo,其中包含数据,我想将其复制到一个新的自变量我的数据:TAnalyzeInfo 是否可以复制整个结构或逐个添加?您可以使用系统单元中声明的移动过程: system.move(pDataSource^,MyData,sizeof(TAnalyzeInfo)) 否,无法使用单个复制命令复制动态数组。你必须: 复制每个非数组字段 对于每个阵列 在目标中创建大小正确的新数组 将数组成员复制到 如果数组是静态的,那就容易多了。在这种情况下,可以复制整个

我有
pDataSource:PAnalyzeInfo
,其中包含数据,我想将其复制到一个新的自变量<代码>我的数据:TAnalyzeInfo


是否可以复制整个结构或逐个添加?

您可以使用系统单元中声明的移动过程:
system.move(pDataSource^,MyData,sizeof(TAnalyzeInfo))

否,无法使用单个复制命令复制动态数组。你必须:

  • 复制每个非数组字段
  • 对于每个阵列
  • 在目标中创建大小正确的新数组
  • 将数组成员复制到

  • 如果数组是静态的,那就容易多了。在这种情况下,可以复制整个内存块。

    在Delphi中,由于编译器的魔力,您只需分配一条记录,就可以复制它

    ...
      PAnalyzeInfo = ^TAnalyzeInfo;
      TAnalyzeInfo = record
        pPitch: array of Single;
        pEnergy: array of Single;
        pPitchAccent: array of Single;
        pEnergyAccent: array of Single;
        pDicAccent: array of Single;
        pScore: array of Single;
        pBoundary: Integer;
        szRecWord: array of array of AnsiChar;
        nRecWordNum: Integer;
        nFrameNum: Integer;
      end;
    ...
    
    动态数组是引用计数的,因此只要不需要真正的深度拷贝,分配也会处理动态数组。通过一个简单的分配,它们只共享相同的内存

    如果您不想这样做,可以单独复制:

    MyData := DataSource^;
    

    好吧,但我们必须小心数组。在记录中,数组只是指向实际数组数据的指针,因此新记录和原始记录的成员将指向相同的数组。不会复制数组数据--每个成员只有一个数组。不是所有数组,只有动态数组(无边界)是PTR。不要这样做。问题中结构中的每个数组都是动态数组,它们是引用并具有引用计数。使用Move复制它将复制引用而不改变引用计数;当只剩下一个对数组的引用时(从处理其他副本中),剩余的副本将有指向解除分配数据的悬空指针。是的,所有都正确。请考虑打开/动态数组的引用计数限制。只要源是持久性的,并且您只需要有一个临时副本(例如,为了方便起见),并且只需要在不修改数组元素的情况下引用值,这种肮脏的伎俩才是安全的。动态数组不使用写时复制。它们像字符串一样被引用计数,但分配数组元素不会像分配字符串字符时那样创建数组的新副本。
    MyData.pPitch = Copy(pDataSource^.pPitch, Low(pDataSource^.pPitch), 
                                              High(pDataSource^.pPitch);