2010-11-30 2 views
10

어떻게 C#에서 포인터를 사용합니까? C#이 관리되는 언어이고 가비지 수집기가 메모리 누수를 막고 메모리를 올바르게 확보한다면 C#에서 포인터를 사용하는 효과는 무엇이며 어떻게 "안전하지 않은"이 될까요?C# 포인터 사용

답변

5

포인터를 사용하려면 안전하지 않은 코드를 허용하고 포인터를 unsafe으로 사용하여 메서드를 표시해야합니다. 그런 다음 확인 가비지 컬렉터를 이동하지 않습니다 수 있도록 메모리에있는 포인터를 수정해야 :

byte[] buffer = new byte[256]; 

// fixed ensures the buffer won't be moved and so make your pointers invalid 
fixed (byte* ptrBuf = buffer) { 
    // ... 
} 

그것은 이론적으로, 당신은 포인터를 가지고 전체 주소 공간을 걸을 수 있기 때문에 안전하고, 손상되었거나 내부 CLR 데이터 구조를 변경하여 메소드 구현을 변경하십시오. 관리 코드에서는 그렇게 할 수 없습니다.

2

C#은 제한된 방식으로 포인터를 지원합니다. C# 포인터는 값 유형 및 배열의 ​​메모리 주소를 보유하기 위해서만 선언 할 수 있습니다. 참조 유형과 달리 포인터 유형은 기본 가비지 수집 메커니즘에 의해 추적되지 않습니다. 또한 포인터는 참조 유형이나 참조 유형을 포함하는 구조 유형을 가리킬 수 없습니다. 따라서 순수한 C#에서는 제한된 용도로 사용됩니다. '안전하지 않은'코드에서 사용된다면, 그들은 꽤 안전하지 않은 것으로 간주 될 것입니다 (물론!).

4

C# (안전하지 않은 코드 블록 내부)의 포인터를 사용하면 메모리가 프레임 워크에서 관리되지 않습니다. 자신의 기억을 관리하고 스스로 청소해야합니다.

... 따라서 상당히 "안전하지 않은"경우를 생각합니다.

+1

'메모리가 프레임 워크에 의해 관리되지 않음'이 기술적으로 올바르지 않습니다. 만약 당신이 관리 객체 (배열, 말)에 포인터를 가져 간다면 메모리는 여전히 CLR에 의해 관리됩니다. 단지 '고정 된'동안 아무 것도 할 수 없습니다 ... – thecoop

+0

포인터와 intptr. 귀하의 설명에 따라 intptr 고정 된 메모리 포인터를 가정 할 것이라고? –