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.
Przykł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
}
Wymagania
Opcja kompilatora:/clr
Zobacz też
Informacje
Operator odwołania śledzenia (C++ Component Extensions)