2014-09-11 2 views
2

:문자열에 대한 포인터를 사용할 수없는 이유는 무엇입니까? 다음과 같은 코드로

그것은 컴파일 오류가 발생
static unsafe void Main(string[] args) 
{ 
    int a = 5; 
    IntPtr pa = new IntPtr(&a); // no error 
    var xa = pa.ToPointer(); 

    string b = "test"; 
    IntPtr pb = new IntPtr(&b); // compile error 
    var xb = pb.ToPointer(); 
} 

:

관리 유형 ('유형')에 대한 포인터를,의 주소를 가지고의 크기를 얻을, 또는 선언 할 수 없습니다

관리되는 유형의 포인터가 있으면 어떨까요?

+1

가능한 복제본 [주소를 가져올 수 없거나 크기를 가져 오거나 관리되는 유형을 가리키는 포인터를 선언 할 수 없습니다] (http://stackoverflow.com/ 질문/13299153/get-the-take-of-a-get-of-a-of-a-managed-a-managed-to-a-managed-t) –

+1

가능한 복제본 [C# .NET 지점에서 IntPtr 작성 가능 문자열 값] (0120)을 참조하십시오. –

+1

컴파일러는 사용자가 IntPtr을 참조 할 수 없다고 100 % 확신합니다. 바르게. 그것은 맞습니다. 문자열은 IntPtr을 초기화 한 후 아무 때나 파괴 될 수 있습니다. .NET 가비지 컬렉터는 보수적 인 수집가가 아닙니다. –

답변

1

관리되는 개체가 다른 개체의 가비지 수집의 부작용으로 메모리에서 이동할 수 있으므로 개체에 대한 포인터가 무효화 될 수 있습니다.

int 주소가 스택에 있고 메모리에서 이동하지 않으므로 포인터를 액세스 할 수 있습니다. (글쎄, 포인터를 사용하는 것만 큼 안전 할 수 있습니다 ...)

관련 문제