기능 내에서 안전하지 않은 포인터를 반환 할 수있는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/574874

  •  05-09-2019
  •  | 
  •  

문제

나는 최근에 실제로 이것을하는 몇 가지 오픈 소스 프로젝트를 보았습니다. "int* input = this.someiterator.getunsafptr ()"과 같은 함수에서 안전하지 않은 포인터를 반환하십시오.

내 이해로 인해 이것은 완전히 잘못되어야합니다. 안전하지 않은 포인터는 '고정 된'진술을 통해서만 얻을 수 있으며 확실히 함수 내에서 반환 된 것들은 더 이상 고정되지 않을 것입니다 (선언 범위를 잃어 버릴 것입니다).

그러나 컴파일러가 이것에 대한 경고를주는 컴파일러를 기억하지 못합니다. 실제로 '고정되지 않은'포인터가 완전히 퍼져 나갈 수 있다면 왜 고정 진술을 사용 하는가?

도움이 되었습니까?

해결책

나는 오픈 소스 프로젝트에서 그러한 구조를 본 적이 없다. 귀하의 질문에 그러한 사용법의 일부 샘플을 제공하면 더 나을 것입니다. 그것의 의미는 행동에 달려있을 수 있습니다.
그러나 나는 동의합니다. 안전하지 않은 포인터는 사악하며 일부 기본 라이브러리 나 코드와 상호 작용할 때만 사용해야합니다.
내가 기억하는 한, 당신은 안전하지 않은 블록에서만이 구조를 사용할 수 있습니다. 그래서 컴파일러는 여기서 어떤 경고도 제공하지 않을 것이라고 생각합니다. IMO intptr을 사용하는 것이 좋습니다 (안전하지 않은 블록은 풀 트러스트에서만 실행할 수 있음).
편집하다:
@stephen은 맞습니다. intptr은 GC 컬렉션의 객체를 계속 참조하지 않습니다.

다른 팁

어때요 Marshal.AllocHGlobal 또는 Marshal.AllocCoTaskMem, 둘 다 intptr을 반환합니다. void * 사용 .ToPointer() 기능 ?

또는 포인터는 관리되지 않는 코드에서 유래 할 수 있습니다. 당신은 필요합니다 fix/pin 메모리가 관리되기 때문에 메모리, 따라서 그렇지 않은 한 fixed/pinned 쓰레기 수집가는 자유롭게 움직일 수 있으며 포인터를 유효하게 렌더링합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top