다음을 통해 공유


추적 참조 연산자(C++ 구성 요소 확장)

추적 참조(%)는 일반 C++ 참조(&)처럼 동작하지만, 예외적으로 개체를 추적 참조에 할당한 경우는 개체 참조 개수가 증가합니다.

모든 플랫폼

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

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

  • 네이티브 참조(&)는 *를 역참조할 경우의 결과입니다. 추적 참조(%)는 ^를 역참조할 경우의 결과입니다. &와 %의 유일한 차이점은 &은 "원시" 참조이고 %는 참조 개수가 계산되는 참조라는 점입니다. 개체에 %가 있을 경우 해당 개체는 메모리에 유지됩니다.

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

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

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

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

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

Windows 런타임

추적 참조는 참조 개수를 계산하는 표준 C++ 참조처럼 동작합니다. C++ 참조에 대한 자세한 내용은 참조 (C++)를 참조하십시오.

다음 예제는 추적 참조를 사용하여 개체가 가리키는 개체의 내용을 수정하는 방법을 보여 줍니다.

/ZW
using namespace Platform;
int main()
{
array<String^> ^arr = ref new array<String^>(10);
    int i = 0;

    for(int i = 0; i < 10; ++i){ 
        String^& s = arr[i];
        s = i++.ToString(); // changes the array content
    }
}

공용 언어 런타임

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

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

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

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;
}

예제

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

// 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]);
}

Output