, 나는 보통내부 작업 '고정': 메모리 위치 또는 개체 작업? 관리/관리되지 않는 배열의 상호 운용성에
fixed (byte* data = new byte[length])
{
// work with the array
}
을 가지고 있지의 경우가 아니라,이 같은 난 단지 참조를 가져옵니다 배열, 고정하려면 :
IntPtr dataPtr = camera.Image2d.GetDataBuffer();
fixed (byte* data = (byte *)dataPtr)
{
// work with the array
}
을
1) "fixed"는 메모리 관리자에서 메모리 위치를 낮은 수준으로 고정시킬 것이고, 가리키는 객체는 신경 쓰지 않으므로 저의 이해에 따라 하단 코드도 작동해야합니까? (의미, 나는/직접 포인터를 "루트"를 가지고 있지 않습니다 - 아마도 그러한 개념이 없다하더라도.)
가 가하나 추가 질문 :
2) 요구 사항은 '고정'을 사용하려면 출처 CLR 메모리 관리자는 실행 된 코드와 동시에 실행되므로 언제든지 배열을 이동할 수 있습니까?
'고정'부분은 타입 캐스팅을 해결 한 후에 작동합니다. –
GC는 메모리 만 이동할 수 없으며 개체 만 이동할 수 있습니다. 'GetDataBuffer'가'IntPtr'을 반환하면, 포인터는 이미 고정 된 객체 (또는 관리되지 않는 메모리)를 포함하는 메모리를 가리켜 야합니다. 고정 해제 된 객체를 사용하여 포인터를 메모리로 반환하는 것은 의미가 없습니다. – dtb
이것은 나에게 매우 의심스럽게 보입니다. IntPtr의 출처는 어디입니까? P/Invoke를 통해 무언가에서 반환됩니까? 관리되지 않는 메모리를 가리킬 수 있으므로 고정하면 아무 효과가 없습니다. 어떤 관리 객체를 가리키는 경우 실제 참조가 아닌 IntPtr입니까? –