추적 참조 연산자(C++/CLI 및 C++/CX)

추적 참조(%)는 개체가 추적 참조에 할당될 때 개체의 참조 수가 증가한다는 점을 제외하고 일반 C++ 참조(&)처럼 동작합니다.

모든 플랫폼

추적 참조에는 다음과 같은 특징이 있습니다.

  • 추적 참조에 개체를 할당하면 개체의 참조 수가 증가합니다.

  • 네이티브 참조(&)는 *를 역참조할 경우의 결과입니다. 추적 참조(%)는 ^를 역참조할 경우의 결과입니다. 개체에 대한 %가 있는 한, 개체가 메모리에 유지됩니다.

  • 개체 멤버에 액세스하는 데 점(.) 멤버 액세스 연산자가 사용됩니다.

  • 추적 참조는 값 형식 및 핸들에만 유효합니다(예: String^).

  • 추적 참조는 null 또는 nullptr 값을 할당할 수 없습니다. 추적 참조는 필요한 횟수만큼 유효한 다른 개체에 다시 할당할 수 있습니다.

  • 추적 참조는 단항 주소 연산자로 사용할 수 없습니다.

Windows 런타임

추적 참조는 %가 참조 개수를 계산한다는 점을 제외하면 표준 C++ 참조처럼 동작합니다. 다음 코드 조각에서는 % 형식과 ^ 형식을 변환하는 방법을 보여 줍니다.

Foo^ spFoo = ref new Foo();
Foo% srFoo = *spFoo;
Foo^ spFoo2 = %srFoo;

다음 예제에서는 %를 사용하는 함수에 ^를 전달하는 방법을 보여 줍니다.

ref class Foo sealed {};

    // internal or private
    void UseFooHelper(Foo% f)
    {
        auto x = %f;
    }

    // public method on ABI boundary
    void UseFoo(Foo^ f)
    {
        if (f != nullptr) { UseFooHelper(*f); }
    }

공용 언어 런타임

C++/CLI에서는 가비지 수집 힙에 있는 CLR 형식의 개체에 바인딩할 경우 핸들에 대해 추적 참조를 사용할 수 있습니다.

CLR에서는 가비지 수집기가 참조 개체를 이동할 때마다 추적 참조 변수의 값이 자동으로 업데이트됩니다.

추적 참조는 스택에서만 선언할 수 있습니다. 추적 참조는 클래스의 멤버일 수 없습니다.

가비지 수집 힙에서는 개체에 대한 네이티브 C++ 참조를 사용할 수 없습니다.

C++/CLI의 추적 참조에 대한 자세한 내용은 다음을 참조하십시오.

예제

C++/CLI에 대한 다음 샘플은 네이티브 및 관리되는 형식을 사용하여 추적 참조를 사용하는 방법을 보여 줍니다.

// tracking_reference_1.cpp
// compile with: /clr
ref class MyClass {
public:
   int i;
};

value struct MyStruct {
   int k;
};

int main() {
   MyClass ^ x = ref new MyClass;
   MyClass ^% y = x;   // tracking reference handle to reference object

   int %ti = x->i;   // tracking reference to member of reference type

   int j = 0;
   int %tj = j;   // tracking reference to object on the stack

   int * pi = new int[2];
   int % ti2 = pi[0];   // tracking reference to object on native heap

   int *% tpi = pi;   // tracking reference to native pointer

   MyStruct ^ x2 = ref new MyStruct;
   MyStruct ^% y2 = x2;   // tracking reference to value object

   MyStruct z;
   int %tk = z.k;   // tracking reference to member of value type

   delete[] pi;
}

C++/CLI에 대한 다음 샘플은 배열에 추적 참조를 바인딩하는 방법을 보여 줍니다.

// tracking_reference_2.cpp
// compile with: /clr
using namespace System;

int main() {
   array<int> ^ a = ref new array<Int32>(5);
   a[0] = 21;
   Console::WriteLine(a[0]);
   array<int> ^% arr = a;
   arr[0] = 222;
   Console::WriteLine(a[0]);
}
21
222