好吧,我知道您通常如何声明一个指针:

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

除非托管数组不包含任何元素,否则此方法工作正常。在这种情况下,它将引发IndexOutOfRangeException。

在C#中,您可以执行以下操作:
void SomeFunction(float[] managedArray)
{
  fixed (float* managedArrayPtr = managedArray)
  {
  }
}

即使托管数组为空,也不进行内存访问并且可以工作。
我真的必须检查所有我使用指向托管数组的指针的元素的数量吗,还是C++/CLI像C#一样有办法做到这一点?
它应该使用ASM中的“lea”指令,该指令不进行内存访问。

任何帮助是极大的赞赏!

最佳答案

当数组为空时,尝试从数组中读取没有什么意义。只需检查一下:

void SomeFunction(array<float> ^managedArray)
{
    if (managedArray->Length > 0) {
        pin_ptr<float> managedArrayPtr = managedArray;
        //etc...
    }
}

10-04 16:37