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

时间:2011-08-04 15:33:31

标签: c++ c++-cli native 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);

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

2 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:3)

你做的几乎是正确的:

pin_ptr<Byte> pinPtrArray = &ManagedClass.ByteArray[ManagedClass.ByeArray->GetLowerBound(0)];

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

编辑:如果您愿意,可以检查长度以确保memcpy不会超过边界,例如:

if (arrayCount > ManagedClass.ByteArray.Length)
    (throw Out of bounds copy exception)