2013-04-22 2 views
0

У меня есть унаследованного кода, который скопировать родной массив в управляемом один:бесполезно pin_ptr при копировании массива

float* nativeValues = new float[NumberOfSamples]; 
array<double>^ managedValues = gcnew array<double>(NumberOfSamples); 

pin_ptr<double> pinnedValues = &managedValues[0]; 
for (int i = 0; i < managedValues->Length; i++) 
{ 
    nativeValues[i] = (float) pinnedValues[i]; 
} 

Я не могу реорганизовать его Runtime::InteropServices::Marshal::Copy, потому что исходный массив является двойной и цель одна плавать.

Моя проблема: я не понимаю почему pin_ptr. Я не думаю, что это необходимо, но это критический фрагмент кода, и я бы хотел убедиться, прежде чем удалять его.

Считаете ли вы безопасным его удаление?

+0

Я понимаю, что пиннинг понадобится, если я получаю доступ к управляемому массиву с помощью арифметики указателей. Но это просто использование индексатора, так что это не должно быть важно, если GC запускает и перемещает вещи вокруг – ekt

ответ

2

Если вы собираетесь передать pin_ptr непосредственно неуправляемому API в качестве double*.

void SomeUnmanagedAPI(double* data, int length); 

// Example of where pin_ptr would be needed. 
pin_ptr<double> pinnedValues = &managedValues[0]; 
SomeUnmanagedAPI(pinnedValues, managedValues->Length); 

Для ручной копии или маршала :: Копия не требуется. Идем дальше и удаляем его, и просто переходим через managedValues.

 Смежные вопросы

  • Нет связанных вопросов^_^