Указатель на управляемый массив в C ++ / CLI - PullRequest
5 голосов
/ 19 августа 2010

Хорошо, я знаю, как вы обычно объявляете указатель:

void SomeFunction(array<float> ^managedArray)
{
  pin_ptr<float> managedArrayPtr = &managedArray[0];
}

Это прекрасно работает, за исключением случая, когда managedArray не содержит элементов.В этом случае он генерирует исключение IndexOutOfRangeException.

В C # вы можете сделать это:

void SomeFunction(float[] managedArray)
{
  fixed (float* managedArrayPtr = managedArray)
  {
  }
}

, который не имеет доступа к памяти и работает, даже если managedArray пуст.Нужно ли проверять количество элементов везде, где я использую указатели на управляемые массивы, или в C ++ / CLI есть способ сделать это, как в C #?Следует использовать инструкцию lea в ASM, которая не имеет доступа к памяти.

Любая помощь приветствуется!

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Нет смысла пытаться читать из массива, когда он пуст.Просто проверьте это:

void SomeFunction(array<float> ^managedArray)
{
    if (managedArray->Length > 0) {
        pin_ptr<float> managedArrayPtr = managedArray;
        //etc...
    }
}
1 голос
/ 19 августа 2010

Хороший вопрос.К сожалению, я не очень знаком с C ++ / CLI.Я знаю, что вы можете сделать закрепление вручную с помощью структуры GCHandle и работать с пустыми массивами.Это не так элегантно, как использование pin_ptr.

void SomeFunction(array<float> ^managedArray) 
{ 
 GCHandle handle = GCHandle::Alloc(managedArray, GCHandleType::Pinned);
 try 
 {
  float* ptr = (float*)(void*)handle.AddrOfPinnedObject();
 }
 finally
 {
  handle.Free();
 }
} 
...