어떻게 C#에서 포인터를 사용합니까? C#이 관리되는 언어이고 가비지 수집기가 메모리 누수를 막고 메모리를 올바르게 확보한다면 C#에서 포인터를 사용하는 효과는 무엇이며 어떻게 "안전하지 않은"이 될까요?C# 포인터 사용
10
A
답변
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. C 포인터 포인터 질문
- 2. C++, SQLite - 문자열 포인터 포인터
- 3. C++ 개인 포인터 "유출"?
- 4. 포인터 및 구조체 사용
- 5. 함수 포인터 사용
- 6. 실용적인 포인터 사용법 (C++)
- 7. C#에서 C DLL을 사용하여 배열과 포인터 사용
- 8. C++에서 C 라이브러리에서 반환 된 포인터 사용
- 9. C++ 포인터 문제
- 10. C++ 포인터 연산 이상한
- 11. C++의 멤버 연산자에 대한 포인터 포인터
- 12. C#의 비 관리 코드를위한 포인터 포인터
- 13. C++ 포인터 - 충돌 선언과 포인터에 대한 포인터
- 14. char 배열에 대한 포인터 사용
- 15. C 포인터 표기법
- 16. C#에서 포인터?
- 17. C++ 포인터 질문
- 18. C++ 함수 포인터 구문
- 19. 목표 C 포인터
- 20. 불량 포인터? - C++
- 21. C++ 템플릿 및 포인터
- 22. C : 모든 유형의 포인터?
- 23. C++ 함수의 포인터
- 24. 이해 포인터 C++
- 25. C#의 포인터 수학
- 26. 목표 - C 대표 포인터
- 27. C# 마샬링 부동 포인터
- 28. 기본 C 포인터 질문
- 29. C++ 참조/포인터
- 30. C++의 자동 포인터
'메모리가 프레임 워크에 의해 관리되지 않음'이 기술적으로 올바르지 않습니다. 만약 당신이 관리 객체 (배열, 말)에 포인터를 가져 간다면 메모리는 여전히 CLR에 의해 관리됩니다. 단지 '고정 된'동안 아무 것도 할 수 없습니다 ... – thecoop
포인터와 intptr. 귀하의 설명에 따라 intptr 고정 된 메모리 포인터를 가정 할 것이라고? –