2013-02-06 4 views
4

, 나는 보통내부 작업 '고정': 메모리 위치 또는 개체 작업? 관리/관리되지 않는 배열의 상호 운용성에

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 메모리 관리자는 실행 된 코드와 동시에 실행되므로 언제든지 배열을 이동할 수 있습니까?

+0

'고정'부분은 타입 캐스팅을 해결 한 후에 작동합니다. –

+2

GC는 메모리 만 이동할 수 없으며 개체 만 이동할 수 있습니다. 'GetDataBuffer'가'IntPtr'을 반환하면, 포인터는 이미 고정 된 객체 (또는 관리되지 않는 메모리)를 포함하는 메모리를 가리켜 야합니다. 고정 해제 된 객체를 사용하여 포인터를 메모리로 반환하는 것은 의미가 없습니다. – dtb

+3

이것은 나에게 매우 의심스럽게 보입니다. IntPtr의 출처는 어디입니까? P/Invoke를 통해 무언가에서 반환됩니까? 관리되지 않는 메모리를 가리킬 수 있으므로 고정하면 아무 효과가 없습니다. 어떤 관리 객체를 가리키는 경우 실제 참조가 아닌 IntPtr입니까? –

답변

3

1) 실제 개체가 아니라 포인터를 고정하려고하는 fixed 키워드를 사용하면 두 번째 것이 적절하지 않은 것으로 보입니다. 그리고 IntPtr도 관리되는 포인터가 아니라 관리되지 않는 포인터입니다.

2) fixed은 지정된 관리 변수에 대한 포인터를 작성합니다. 고정하지 않으면 GC가 변수를 다른 메모리 위치로 재배치 할 수 있으므로 포인터가 쓸모 없게됩니다. msdn에서

:

고정 문 명령문의 실행 동안 변수 관리 포인터와 "핀" 해당 변수를 설정한다. 고정되지 않으면 가비지 수집은 변수를 예측할 수 없게 재배치 할 수 있기 때문에 이동 가능한 관리 변수에 대한 포인터는 거의 사용되지 않습니다. C# 컴파일러에서는 고정 문을 사용하여 관리되는 변수에 대한 포인터 만 할당 할 수 있습니다.