2014-01-11 2 views
4

"안전한"코드로 IntPtr을 실험하고 "안전하지 않은"모드로 작업하는 방식과 비교합니다.GCHandleType.Pinned는 "고정 된"키워드 사용과 비슷합니까?

GCHandleType.Pinned는 안전하지 않은 모드에서 "fixed"를 사용하는 것과 비슷합니까?

GCHandle pinnedArray = GCHandle.Alloc(byteArray, GCHandleType.Pinned); 
IntPtr pointer = pinnedArray.AddrOfPinnedObject(); 
//do your stuff 
pinnedArray.Free(); 

byte[] buffer = new byte[255]; 
fixed (byte* p = buffer) 
{ 
    IntPtr ptr = (IntPtr)p; 
    // do you stuff here 
} 

답변

2

대 예, 결과는 동일합니다. 차이점은 사용법에 있습니다. 버퍼를 비동기 적으로 채우고 완료되면 콜백을 호출하는 외부 메서드를 가정합니다. 고정 된 키워드를 사용하여 고정 된 버퍼 포인터를 전달할 수 없습니다. 일단 변수가 범위를 벗어나면 외부 메소드가 여전히 변수를 사용하려고 시도하기 때문에 고정 해제됩니다.