复制数组时无用的pin_ptr

时间:2013-04-22 09:58:06

标签: arrays c++-cli 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重构它,因为原始数组是double,目标是float。

我的问题是我不明白为什么pin_ptr。我认为不需要,但它是一段重要的代码,我希望在删除它之前确定。

你觉得删除它是否安全?

1 个答案:

答案 0 :(得分:2)

如果您要将pin_ptr 直接作为double*传递给非托管API,则需要pin_ptr。

void SomeUnmanagedAPI(double* data, int length);

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

对于手动副本或Marshal :: Copy,不需要它。继续删除它,然后迭代managedValues。