我这样做对吗?

我得到一个指向 native 数组的指针,需要复制到托管数组。将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的实际长度,因此不必担心该方面。看一下代码,然后从 vector 复制数组。因此,我可以安全地设置托管阵列的大小。

最佳答案

您所做的几乎是正确的:

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

元帅::复制并不安全,而且速度也不快。始终在托管C++中使用固定指针。

编辑:如果需要,您可以检查长度以确保memcpy不会首先超出范围,例如:
if (arrayCount > ManagedClass.ByteArray.Length)
    (throw Out of bounds copy exception)

08-06 15:08