문제

프로젝트 중 하나에서 다음과 비슷한 코드가 있습니다. 누구든지 (간단한 영어로) 왜 고정 진술이 여기에 필요한가?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}
도움이 되었습니까?

해결책

메모리에서 포인터를 수정합니다. 쓰레기 수집 된 언어는 효율성을 위해 메모리 주위의 물체를 자유롭게 움직일 수 있습니다. 이것은 "일반"CLR 코드에서 실제로 포인터를 사용하지 않기 때문에 프로그래머에게 투명합니다. 그러나 포인터가 필요할 때 포인터와 함께 작업하려면 메모리로 고정해야합니다.

다른 팁

그만큼 고정 진술 수집 할 때 쓰레기 수집기가 이동하지 않도록 메모리의 변수를 "핀"합니다. 변수를 움직이면 포인터가 쓸모 없게되며 사용하면 의도하지 않은 것을 액세스하거나 수정하려고합니다.

쓰레기 수집가가 당신을 움직이게하는 것을 방지하기 위해 포인터 산술을하는 곳마다 필요합니다.

안전하지 않은 모드 (포인터)로 실행 중이므로 고정 명령은 특정 메모리 공간을 해당 변수에 할당합니다. 고정 지침을하지 않으면 쓰레기 수집기가 원할 때 어디서나 변수를 메모리로 움직일 수 있습니다.

이 도움을 바랍니다.

MSDN 매우 비슷한 예가 있습니다. 고정 진술은 기본적으로 쓰레기 수집을 차단합니다. .NET에서 메모리 위치에 대한 포인터를 사용하는 경우 런타임은 언제든지 객체를 "더 나은"위치로 재 할당 할 수 있습니다. 따라서 메모리에 직접 액세스하려면 제자리에 메모리를 고정해야합니다.

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