我有一些遗留代码,它将原生数组复制到托管数据中:
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。我认为不需要,但它是一段重要的代码,我希望在删除它之前确定。
你觉得删除它是否安全?
答案 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。