我这样做了吗?
我得到一个指向本机数组的指针,需要复制到托管数组。将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的实际长度,因此并不担心这个方面。查看代码并从向量中复制数组。所以我可以安全地设置托管数组大小。
答案 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)