Memcpy собственного массива в управляемый массив в C ++ CLI - PullRequest
8 голосов
/ 04 августа 2011

Я правильно делаю?

Я получаю указатель на собственный массив, и мне нужно скопировать его в управляемый массив. Используйте 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 ]

12 голосов
/ 04 августа 2011

Это работает, но не безопасно.Когда вы неправильно наберете arrayCount , вы попадете в кучу мусора вдребезги.Очень трудно диагностировать.

Marshal :: Copy () безопасен и так же быстр.

3 голосов
/ 04 августа 2011

Вы делаете это почти правильно:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...