在C++ CLI中将本机数组的Memcpy发送到托管数组

Sop*_*pus 8 c++ native c++-cli memcpy

我这样做了吗?

我得到一个指向本机数组的指针,需要复制到托管数组.将memcpy()与pin_ptr一起使用.

unsigned char* pArray;
unsigned int arrayCount;
// get pArray & arrayCount (from a COM method) 

ManagedClass->ByteArray = gcnew array<Byte,1>(arrayCount)
pin_ptr<System::Byte> pinPtrArray = &ManagedClass->ByteArray[0];
memcpy_s(pinPtrArray, arrayCount, pArray, arrayCount);
Run Code Online (Sandbox Code Playgroud)

arrayCount是pArray的实际长度,因此并不担心这个方面.查看代码并从向量中复制数组.所以我可以安全地设置托管数组大小.

Han*_*ant 12

这有效,但不安全.当你得到arrayCount错误时,你会把垃圾收集堆吹到碎片上.很难诊断.

Marshal :: Copy()是安全的,同样快.

  • 不,你认为固定是免费的.它不是.CLR可以在没有固定的情况下完成.clr/src/vm/common.h,memcpyNoGCRefs()函数. (3认同)
  • 元帅::复制不安全.这是一个例子:http://stackoverflow.com/questions/6945998/copy-from-const-char-to-a-byte-array-cc-interop-marshalcopy/6946226#6946226 (2认同)
  • 通过弄乱本机缓冲区大小来获得即时AV不能与无声堆损坏引起的痛苦相提并论。 (2认同)
  • 不,有些人不检查.阅读文档:非托管,C样式数组不包含边界信息,这会阻止验证startIndex和length参数.因此,对应于源参数的非托管数据填充托管阵列,而不管其有用性.在调用此方法之前,必须使用适当的大小初始化托管数组. (2认同)

Ed *_*tes 3

你做的几乎是正确的:

pin_ptr<Byte> pinPtrArray = &ManagedClass.ByteArray[ManagedClass.ByeArray->GetLowerBound(0)];
Run Code Online (Sandbox Code Playgroud)

Marshal::Copy 不安全且速度不快。在托管 C++ 中始终使用固定指针。

编辑:如果需要,您可以检查长度以确保 memcpy 不会首先超出范围,例如:

if (arrayCount > ManagedClass.ByteArray.Length)
    (throw Out of bounds copy exception)
Run Code Online (Sandbox Code Playgroud)