Udostępnij za pośrednictwem


Operator uchwytu do obiektu (^) (C++ Component Extensions)

Uchwyt; niewłaściwy deklarator (^, wyraźny "hat"), modyfikuje typu specyfikatora oznacza, że deklarowanym powinien automatycznie usuwane, gdy system Określa, że obiekt jest już dostępny.

Dostęp do obiektu deklarowanej

Zmienna, która jest zadeklarowana z; niewłaściwy deklarator uchwytu zachowuje się jak wskaźnik do obiektu.Zmienna punkty do całego obiektu, nie wskazują Członkowskie obiektu i nie obsługuje arytmetycznej wskaźnika.Użyj operatora pośrednia (*) dostęp do obiektu i operatora dostępu Członkowskie strzałkę (->) uzyskać dostępu do członka obiektu.

Środowisko wykonawcze systemu Windows

Kompilator używa kom liczenia odniesienia mechanizmu, aby ustalić, czy obiekt jest już używany i mogą być usunięte.Jest to możliwe, ponieważ obiekt, który pochodzi z interfejsu systemu Windows w czasie wykonywania jest faktycznie obiektu COM.Liczbę odwołań jest zwiększana, gdy obiekt jest utworzone lub skopiowane i zmniejszany, gdy obiekt jest ustawiona na null lub elektrotechnicznych blach teksturowanych poza zakresem.Jeśli licznika odwołań do zera, obiekt automatycznie i bezzwłocznie skreśla się.

Zaletą; niewłaściwy deklarator uchwyt jest, że w modelu COM musi jawnie zarządzasz licznika odwołań do obiektu, który jest procesem podatne nużące i błąd.Oznacza to aby zwiększać i zmniejszyć liczbę odwołań musi wywołać metod obiektu AddRef() i Release().Przy deklarowaniu obiektu z; niewłaściwy deklarator uchwyt kompilatora Visual C++ generuje kod, który automatycznie dostosowuje liczbę odwołań.

Aby uzyskać informacje dotyczące tworzenia wystąpienia obiektu, zobacz ref nowy.

Wymagania

Opcja kompilatora:/ZW

Środowisko uruchomieniowe języka wspólnego

System używa CLR garbage collector mechanizmu, aby ustalić, czy obiekt jest już używany i mogą być usunięte.Common language runtime utrzymuje sterty, na którym ją przydziela obiekty i zastosowań zarządzanych odniesienia (zmienne) w programie wskazuje położenie obiektów na stercie.Gdy obiekt jest już używany, pamięci, która zajmowała się na stercie jest zwalniana.Okresowo garbage collector kompaktuje stosu do lepszego wykorzystania zwolnionej pamięci.Kompaktowanie sterty obiekty można przenosić na stercie, która unieważnia lokalizacji określonej przez zarządzane odniesienia.Jednakże garbage collector zna lokalizację wszystkie zarządzane odniesienia i automatycznie aktualizuje je wskazać w bieżącej lokalizacji obiektów na stercie.

Ponieważ macierzystym C++ wskaźniki (*) i odwołania (&) nie są zarządzane odniesienia garbage collector nie może automatycznie zaktualizować adresów, aby.Aby rozwiązać ten problem, użyj; niewłaściwy deklarator uchwyt, aby określić zmienną garbage collector jest świadomy i można aktualizować automatycznie.

W Visual C++ 2002 i Visual C++ 2003 __gc * została użyta zamieszcza obiekt zarządzanego stosu.^ Zastępuje __gc * w nowej składni.

Aby uzyskać więcej informacji, zobacz Jak: zadeklarować uchwytów macierzystych typów.

yk97tc08.collapse_all(pl-pl,VS.110).gifPrzykłady

Przykład

Próbka ta pokazuje, jak utworzyć wystąpienia typu odwołania na zarządzanego stosu.Ten przykład pokazuje również, że można zainicjować określonego dojścia w innym, wynikające w dwu odwołań do tego samego obiektu na stercie zarządzanych, zebrane garbage.Należy zauważyć, że przypisanie nullptr (C++ Component Extensions) do określonego dojścia nie oznacza obiekt do kolekcji garbage.

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

Dane wyjściowe

  
  

Przykład

Poniższy przykładowy pokazuje, jak zadeklarować uchwyt do obiektu na stercie zarządzanego, gdzie typ obiektu jest typem wartości ramkach.Przykład pokazuje również, jak typ wartości z ramkach obiektu.

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

Dane wyjściowe

  
  

Przykład

Ten przykład pokazuje, że wspólne idiom C++, wskaż dowolny obiekt za pomocą wskaźnika void * zastępuje obiekt ^, które posiadają uchwyt do dowolnej klasy odniesienia.Pokazuje również, że wszystkich typów, takich jak tablice i delegatów, mogą być konwertowane na uchwyt do obiektu.

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

Dane wyjściowe

  
  
  

Przykład

Ten przykład pokazuje, że można usunąć odwołania uchwyt i że członek jest możliwy za pośrednictwem dereferenced uchwyt.

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

Dane wyjściowe

  
  

Przykład

Ten przykład pokazuje macierzystym odniesienia (&) nie można powiązać z int członkowskich typu zarządzanego jako int mogą być przechowywane w stercie, zebrane garbage i macierzystych odwołania nie śledzić przepływ obiektu w zarządzanych sterty.Poprawka jest użyć zmiennej lokalnej lub zmienić & do %, co odwołanie śledzenia.

// 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(pl-pl,VS.110).gifWymagania

Opcja kompilatora:/clr

Zobacz też

Informacje

Operator odwołania śledzenia (C++ Component Extensions)

Koncepcje

Składnik rozszerzeń dla platform Runtime