다음을 통해 공유


개체 연산자에 대한 핸들(^)(C++ 구성 요소 확장)

자가 처리 (^, "hat"으로 발음), 유형 수정 지정자 시스템 개체를 더 이상 액세스할 수 있는지 결정 하는 경우 선언 된 개체가 자동으로 삭제 될 것을 의미 합니다.

선언 된 개체를 액세스합니다.

핸들 선언 자를 함께 선언 된 변수는 개체에 대 한 포인터 처럼 동작 합니다.그러나 변수 지점 전체 개체, 개체의 멤버에 가리킨 수 없습니다 및 포인터 산술 연산을 지원 하지 않습니다.간접 참조 연산자를 사용 (*) 화살표 멤버 액세스 연산자 및 개체에 액세스 하려면 (->) 개체의 멤버에 액세스 합니다.

Windows 런타임

컴파일러를 사용 하 여 COM 참조 횟수 개체가 더 이상 사용 되 고 삭제 될 수 없습니다 경우 결정 하는 메커니즘입니다.실제로 COM 개체는 런타임에 Windows 인터페이스에서 파생 된 개체 이기 때문에 가능 합니다.개체가 null 또는 이동으로 설정 하면 개체 생성 또는 복사 및 감소 때 참조 횟수가 증가 범위를 벗어났습니다.참조 횟수가 0이 되 면 개체가 자동으로 삭제 됩니다.

핸들 선언 자의 장점은 명시적으로 COM에 지루하고 오류가 발생 하기 쉬운 프로세스는 개체의 참조 카운트가 관리 해야 한다는 것입니다.즉, 참조 횟수를 늘리고에 개체의 AddRef() 및 Release() 메서드를 호출 해야 합니다.그러나 핸들 선언 자를 가진 개체를 선언 하는 경우 Visual C++ 컴파일러에서는 해당 참조 횟수를 자동으로 조정 하는 코드를 생성 합니다.

개체를 인스턴스화하는 방법에 대 한 자세한 내용은 새 ref.

요구 사항

컴파일러 옵션:/ZW

공용 언어 런타임

CLR는 시스템을 사용 하 여 가비지 수집기 개체가 더 이상 사용 되 고 삭제 될 수 없습니다 경우 결정 하는 메커니즘입니다.공용 언어 런타임 힙 개체를 할당을 유지 관리 하 고 사용 하 여 관리 되는 참조 (변수) 프로그램에서 힙에 개체의 위치를 나타냅니다.개체가 더 이상 사용 하는 경우 힙에 차지 하는 메모리는 해제 됩니다.정기적으로 가비지 수집기 힙에 보다 효율적으로 사용할 해제 된 메모리를 압축합니다.힙의 압축 관리 되는 참조 위치 참조를 무효화 힙에 개체 이동할 수 있습니다.그러나 가비지 수집기가 모든 관리 되는 참조 위치를 알고 이며 힙에 있는 개체의 현재 위치를 나타내기 위해이 자동으로 업데이트 합니다.

때문에 네이티브 C++ 포인터 (*)와 참조 (&) 관리 되는 참조 되지 않습니다 가비지 수집기를 가리키는 주소를 자동으로 업데이트할 수 없습니다.이 문제를 해결 하려면 핸들 선언 자를 사용 하 여 가비지 수집기의 인식 하는 변수를 지정 하 고 자동으로 업데이트할 수 있습니다.

Visual C++ 2002와 Visual C++ 2003에서 __gc * 관리 되는 힙에서 개체를 선언 하는 데 사용 되었습니다.^ 대신 __gc * 새 구문에서입니다.

자세한 내용은 방법: 네이티브 형식으로 핸들 선언를 참조하십시오.

yk97tc08.collapse_all(ko-kr,VS.110).gif예제

예제

이 샘플에서는 관리 되는 힙에서 참조 형식의 인스턴스를 만드는 방법을 보여 줍니다.또한이 샘플에서는 두 참조가 동일한 개체를 관리 되는 가비지 수집 된 힙에 그 결과 한쪽 핸들을 다른 초기화할 수 있습니다 보여 줍니다.해당 할당 됩니다 nullptr(C++ 구성 요소 확장) 개체를 가비지 수집에 대 한 핸들을 표시 하지 않습니다.

// mcppv2_handle.cpp
// compile with: /clr
ref class MyClass {
public:
   MyClass() : i(){}
   int i;
   void Test() {
      i++;
      System::Console::WriteLine(i);
   }
};

int main() {
   MyClass ^ p_MyClass = gcnew MyClass;
   p_MyClass->Test();

   MyClass ^ p_MyClass2;
   p_MyClass2 = p_MyClass;

   p_MyClass = nullptr;
   p_MyClass2->Test();   
}

Output

  
  

예제

다음 샘플에서는 개체의 형식이 boxed 값 형식인 관리 되는 힙에 있는 개체에 대 한 핸들을 선언 하는 방법을 보여 줍니다.또한이 샘플 값 형식의 boxed 개체를 가져오는 방법을 보여 줍니다.

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

void Test(Object^ o) {
   Int32^ i = dynamic_cast<Int32^>(o);

   if(i)
      Console::WriteLine(i);
   else
      Console::WriteLine("Not a boxed int");
}

int main() {
   String^ str = "test";
   Test(str);

   int n = 100;
   Test(n);
}

Output

  
  

예제

Void * 포인터가 있는 임의의 개체를 사용 하 여 C++ 관용 개체에 의해 교체 되는이 샘플을 보여 줍니다 ^은 수 채 핸들 참조 클래스에 있습니다.모든 형식, 배열 및 대리자와 같은 개체 핸들을 변환할 수 있는지 보여 줍니다.

// mcppv2_handle_3.cpp
// compile with: /clr
using namespace System;
using namespace System::Collections;
public delegate void MyDel();
ref class MyClass {
public:
   void Test() {}
};

void Test(Object ^ x) {
   Console::WriteLine("Type is {0}", x->GetType());
}

int main() {
   // handle to Object can hold any ref type
   Object ^ h_MyClass = gcnew MyClass;

   ArrayList ^ arr = gcnew ArrayList();
   arr->Add(gcnew MyClass);

   h_MyClass = dynamic_cast<MyClass ^>(arr[0]);
   Test(arr);

   Int32 ^ bi = 1;
   Test(bi);

   MyClass ^ h_MyClass2 = gcnew MyClass;

   MyDel^ DelInst = gcnew MyDel(h_MyClass2, &MyClass::Test);
   Test(DelInst);
}

Output

  
  
  

예제

이 샘플에서는 핸들에 대 한 역참조 및 역참조 된 핸들을 통해 멤버에 액세스할 수를 보여 줍니다.

// mcppv2_handle_4.cpp
// compile with: /clr
using namespace System;
value struct DataCollection {
private:
   int Size;
   array<String^>^ x;

public:
   DataCollection(int i) : Size(i) {
      x = gcnew array<String^>(Size);
      for (int i = 0 ; i < Size ; i++)
         x[i] = i.ToString();
   }

   void f(int Item) {
      if (Item >= Size)
      {
         System::Console::WriteLine("Cannot access array element {0}, size is {1}", Item, Size);
         return;
      }
      else
         System::Console::WriteLine("Array value: {0}", x[Item]);
   }
};

void f(DataCollection y, int Item) {
   y.f(Item);
}

int main() {
   DataCollection ^ a = gcnew DataCollection(10);
   f(*a, 7);   // dereference a handle, return handle's object
   (*a).f(11);   // access member via dereferenced handle
}

Output

  
  

예제

이 샘플에서는 네이티브 참조를 보여 줍니다 (&) 바인딩할 수 없습니다는 int 관리 되는 형식의 멤버와의 int 가비지 수집 된 힙에에 저장 될 수 및 네이티브 참조 관리 되는 힙의 개체 이동을 추적 하지 않습니다.로컬 변수를 사용 하거나 변경 하려면 수정 된 & 에 %를 받아 추적 참조.

// mcppv2_handle_5.cpp
// compile with: /clr
ref struct A {
   void Test(unsigned int &){}
   void Test2(unsigned int %){}
   unsigned int i;
};

int main() {
   A a;
   a.i = 9;
   a.Test(a.i);   // C2664
   a.Test2(a.i);   // OK

   unsigned int j = 0;
   a.Test(j);   // OK
}

yk97tc08.collapse_all(ko-kr,VS.110).gif요구 사항

컴파일러 옵션:/clr

참고 항목

참조

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

개념

런타임 플랫폼의 구성 요소 확장