Memcpy of native array to managed array in C++ CLI

自古美人都是妖i 提交于 2019-12-19 16:35:07

问题


Am I doing this right?

I get a pointer to a native array and need to copy to a managed array. Use memcpy() with a 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 is the actual length of pArray, so not really worried about that aspect. Looked at the code and the array is copied from a vector. So I can set the managed array size safely.


回答1:


You are doing it almost right:

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

Marshal::Copy is not safe and not as fast. Always use pinned pointers in managed C++.

Edit: If you want to, you can check the length to make sure the memcpy won't exceed the bounds first, e.g.:

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



回答2:


That works, but isn't safe. You'll blow the garbage collected heap to smithereens when you get arrayCount wrong. Very hard to diagnose.

Marshal::Copy() is safe and just as fast.



来源:https://stackoverflow.com/questions/6944288/memcpy-of-native-array-to-managed-array-in-c-cli

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!