2013-03-04 10 views
0

안전하지 않은 환경에서는 fixed 문을 사용하여 획득 한 포인터로 안전하게 작업 할 수 있도록 변수의 주소를 얻고 고정 할 수 있음을 알고 있습니다. 그러나 안전하게이 포인터를 어딘가에 저장할 수있는 방법이 있습니까? 에서처럼 포인터 자체가 삭제 될 때까지 변수를 영구적으로 고정 시키십시오.C#에서 영구적으로 변수를 고정시키는 방법?

예를 들어 integer/float/double에 대한 포인터를 내 안전하지 않은 클래스의 구성원으로 지정하려면 어떻게해야합니까? 메모리를 고정하기위한

+1

이것은 무엇입니까? 인터넷? 양식? 코드로 달성하고자하는 것을 더 많이 설명해 주시겠습니까 – CR41G14

+1

@ CR41G14 아마도 질문의 일부를 구성해야하지만 태그를 사용하면 분명히 알 수 있습니다. – JRoughan

+0

이러한 개체를 구식 방식으로 할당하고 관리되는보기 밖으로 유지하는 것이 좋습니다. 관리 객체를 고정하면 가비지 수집기의 문제가 복잡해 지므로 영구 고정하면 관리가 더욱 어려워집니다. – hvd

답변

10

더 영구적 인 해결책은 다음과 같이, GCHandle 클래스를 사용하는 것입니다 : 이것은 당신이 고정 된 객체의 주소를 검색 할 수 있습니다 주위를 이동 GC를 방지

var handle = GCHandle.Create(myObject, GCHandleType.Pinned); 
IntPtr address = handle.AddrOfPinnedObject(); 
//... use it 
handle.Free(); 

. 그러나, 일단 당신이 당신의 GCHandle을 살아 있고 당신이 끝내면 해방해야한다. 이것은 많은 방법 또는 심지어 클래스에 걸쳐 훨씬 더 쉽고 fixed() 블록을 사용합니다.

GC의 작업을 어렵게 만들고 있기 때문에 메모리를 고정하면 성능이 저하 될 수 있습니다.

이동하지 않는 메모리 덩어리가 필요하면 네이티브 코드 등을 사용하여 상호 작용하기 때문에 Marshal.AllocHGlobal()Marshal.FreeHGlobal()을 사용하면 간섭을받지 않는 비 이동식 메모리를 할당 할 수 있습니다 GC.

+0

myObject (Create 메서드의 첫 번째 매개 변수)가 값 형식 인 경우 얻은 주소가 해당 개체의 주소가 될 것인가 아니면 해당 개체의 복사본 주소가됩니까? 그리고 IntPtr을 통해 기본 객체에 어떻게 액세스 할 수 있습니까? 미리 감사드립니다. – IcySnow

+0

구조체 객체를 전달하면 myObject가 값 유형이 될 수 있다고 생각하지 않습니다. GCHandle은 객체 매개 변수를 사용하기 때문에 boxed가됩니다. 당신은 기품없는 물건으로 무엇을 의미합니까? 이미 객체에 대한 참조가 있습니다. 왜냐하면 객체를 고정했기 때문입니다. 그러나 클래스에서 데이터를 레이아웃하는 방법을 잘 알고 있다면 포인터를 가져 와서 오프셋으로 이동하여 액세스 할 수 있습니다. 예를 들어, 배열의 경우 AddOfPinnedObject()에서 포인터를 가져 오면 첫 번째 요소를 가리키고 포인터를 사용하여 배열 요소에 액세스 할 수 있습니다. –

+0

그래서 이미 할당 된 값 유형 변수가 있고 주위로 이동하지 않으려면 GCHandle을 사용하여 작업을 수행 할 수 있습니까? – IcySnow

관련 문제