好吧,我知道你通常会如何声明一个指针:
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#那样做? 它应该使用ASM中的'lea'指令,它不能访问内存。
非常感谢任何帮助!
答案 0 :(得分:3)
当数组为空时尝试从数组中读取没有多大意义。只需检查一下:
void SomeFunction(array<float> ^managedArray)
{
if (managedArray->Length > 0) {
pin_ptr<float> managedArrayPtr = managedArray;
//etc...
}
}
答案 1 :(得分:1)
好问题。不幸的是,我对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();
}
}