Non Tracking Reference 관련 에러

3 분 소요

Tracking / Non Tracking Reference

Non-Tracing Reference 는 주기적인 GC 에서 참조 추적이 되지 않는 참조를 말하며, Managed Cpp 에서 사용하는 % 가 아닌 Unmanaged Cpp 의 & 가 해당된다.

Tracking Reference 는 % 가 해당된다.

에러 1

ref struct AAA
{
    System::String^ path;
};

void SomeFunc()
{
    AAA a;
    System::String^ const& k = a->path; // Error 발생
    marshal_as<std::wstring>(a->path);  // 파라미터가 System::String^ const& 므로 에러발생

    System::String^ b;
    System::String^ const& k = b->path; // Error 없음
}

위와 같이 Managed Entity 의 Member 등에 Non Tracking Reference 를 시도하면 생기는 에러이다.

Managed Entity 의 멤버는 Managed Memory 공간에 있으므로, 여기에 대한 Simple Reference 를 허용하게 되면 GC 등에 의한 Dangling Pointer 참조같은 이상한 일이 발생하게 된다. 그래서 이를 막는 것이다.

비슷한 예로 Managed Entity 에 대해서 & 를 허용하지 않는 것이 있다.

참고로 위의 b 같은 경우는 ^ 가 포인터이므로 *b 가 Managed Memory 에 있고 b 는 스택 공간에 존재한다. 그래서 에러를 발생시키지 않는다.

댓글남기기