auto_gcroot-Klasse
Automatische Ressourcenverwaltung (z . B. auto_ptr Klasse), die zum Einbetten eines virtuellen Handles in einen systemeigenen Typ verwendet werden kann.
Syntax
template<typename _element_type>
class auto_gcroot;
Parameter
_element_type
Der verwaltete Typ, der eingebettet werden soll.
Member
Öffentliche Konstruktoren
Name | Beschreibung |
---|---|
auto_gcroot::auto_gcroot | Der auto_gcroot Konstruktor. |
auto_gcroot::~auto_gcroot | Der auto_gcroot Destruktor. |
Öffentliche Methoden
Name | Beschreibung |
---|---|
auto_gcroot::attach | An ein Objekt anfügen auto_gcroot . |
auto_gcroot::get | Ruft das enthaltene Objekt ab. |
auto_gcroot::release | Gibt das Objekt aus der auto_gcroot Verwaltung frei. |
auto_gcroot::reset | Zerstören Sie das aktuelle Objekt, und übernehmen Sie optional den Besitz eines neuen Objekts. |
auto_gcroot::swap | Tauscht Objekte mit einem anderen auto_gcroot . |
Öffentliche Operatoren
Name | Beschreibung |
---|---|
auto_gcroot::operator-> |
Der Memberzugriffsoperator. |
auto_gcroot::operator= | Zuweisungsoperator. |
auto_gcroot::operator auto_gcroot | Typ-Umwandlungsoperator zwischen auto_gcroot und kompatiblen Typen. |
auto_gcroot::operator bool | Operator für die Verwendung auto_gcroot in einem bedingten Ausdruck. |
auto_gcroot::operator! | Operator für die Verwendung auto_gcroot in einem bedingten Ausdruck. |
Anforderungen
Headerdatei<msclr\auto_gcroot.h>
Namespace msclr
auto_gcroot::auto_gcroot
Der auto_gcroot
Konstruktor.
auto_gcroot(
_element_type _ptr = nullptr
);
auto_gcroot(
auto_gcroot<_element_type> & _right
);
template<typename _other_type>
auto_gcroot(
auto_gcroot<_other_type> & _right
);
Parameter
_ptr
Das zu besitzende Objekt.
_Rechts
Ein vorhandener auto_gcroot
.
Hinweise
Beim Konstruieren eines auto_gcroot
aus einem vorhandenen Objekt auto_gcroot
gibt das vorhandene auto_gcroot
Objekt los, bevor der Besitz des Objekts in das neue auto_gcroot
übertragen wird.
Beispiel
// msl_auto_gcroot_auto_gcroot.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class RefClassA {
protected:
String^ m_s;
public:
RefClassA(String^ s) : m_s(s) {
Console::WriteLine( "in RefClassA constructor: " + m_s );
}
~RefClassA() {
Console::WriteLine( "in RefClassA destructor: " + m_s );
}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
ref class RefClassB : RefClassA {
public:
RefClassB( String^ s ) : RefClassA( s ) {}
virtual void PrintHello() new {
Console::WriteLine( "Hello from {0} B!", m_s );
}
};
class ClassA { //unmanaged class
private:
auto_gcroot<RefClassA^> m_a;
public:
ClassA() : m_a( gcnew RefClassA( "unmanaged" ) ) {}
~ClassA() {} //no need to delete m_a
void DoSomething() {
m_a->PrintHello();
}
};
int main()
{
{
ClassA a;
a.DoSomething();
} // a.m_a is automatically destroyed as a goes out of scope
{
auto_gcroot<RefClassA^> a(gcnew RefClassA( "first" ) );
a->PrintHello();
}
{
auto_gcroot<RefClassB^> b(gcnew RefClassB( "second" ) );
b->PrintHello();
auto_gcroot<RefClassA^> a(b); //construct from derived type
a->PrintHello();
auto_gcroot<RefClassA^> a2(a); //construct from same type
a2->PrintHello();
}
Console::WriteLine("done");
}
in RefClassA constructor: unmanaged
Hello from unmanaged A!
in RefClassA destructor: unmanaged
in RefClassA constructor: first
Hello from first A!
in RefClassA destructor: first
in RefClassA constructor: second
Hello from second B!
Hello from second A!
Hello from second A!
in RefClassA destructor: second
done
auto_gcroot::~auto_gcroot
Der auto_gcroot
Destruktor.
~auto_gcroot();
Hinweise
Der Destruktor destruktiert auch das besitzeigene Objekt.
Beispiel
// msl_auto_gcroot_dtor.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class ClassA {
public:
ClassA() { Console::WriteLine( "ClassA constructor" ); }
~ClassA() { Console::WriteLine( "ClassA destructor" ); }
};
int main()
{
// create a new scope for a:
{
auto_gcroot<ClassA^> a = gcnew ClassA;
}
// a goes out of scope here, invoking its destructor
// which in turns destructs the ClassA object.
Console::WriteLine( "done" );
}
ClassA constructor
ClassA destructor
done
auto_gcroot::attach
An ein Objekt anfügen auto_gcroot
.
auto_gcroot<_element_type> & attach(
_element_type _right
);
auto_gcroot<_element_type> & attach(
auto_gcroot<_element_type> & _right
);
template<typename _other_type>
auto_gcroot<_element_type> & attach(
auto_gcroot<_other_type> & _right
);
Parameter
_Rechts
Das objekt, das angefügt werden soll, oder ein auto_gcroot
Objekt, das angefügt werden soll.
Rückgabewert
Der aktuelle auto_gcroot
.
Hinweise
Wenn es sich um ein auto_gcroot
Objekt _right
handelt, gibt es den Besitz seines Objekts frei, bevor das Objekt mit dem aktuellen auto_gcroot
angefügt wird.
Beispiel
// msl_auto_gcroot_attach.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class ClassA {
protected:
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {
Console::WriteLine( "in ClassA constructor:" + m_s );
}
~ClassA() {
Console::WriteLine( "in ClassA destructor:" + m_s );
}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
ref class ClassB : ClassA {
public:
ClassB( String ^ s) : ClassA( s ) {}
virtual void PrintHello() new {
Console::WriteLine( "Hello from {0} B!", m_s );
}
};
int main() {
auto_gcroot<ClassA^> a( gcnew ClassA( "first" ) );
a->PrintHello();
a.attach( gcnew ClassA( "second" ) ); // attach same type
a->PrintHello();
ClassA^ ha = gcnew ClassA( "third" );
a.attach( ha ); // attach raw handle
a->PrintHello();
auto_gcroot<ClassB^> b( gcnew ClassB("fourth") );
b->PrintHello();
a.attach( b ); // attach derived type
a->PrintHello();
}
in ClassA constructor:first
Hello from first A!
in ClassA constructor:second
in ClassA destructor:first
Hello from second A!
in ClassA constructor:third
in ClassA destructor:second
Hello from third A!
in ClassA constructor:fourth
Hello from fourth B!
in ClassA destructor:third
Hello from fourth A!
in ClassA destructor:fourth
auto_gcroot::get
Ruft das enthaltene Objekt ab.
_element_type get() const;
Rückgabewert
Das enthaltene Objekt.
Beispiel
// msl_auto_gcroot_get.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class ClassA {
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ){
Console::WriteLine( "in ClassA constructor:" + m_s );
}
~ClassA() {
Console::WriteLine( "in ClassA destructor:" + m_s );
}
void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
void PrintA( ClassA^ a ) {
a->PrintHello();
}
int main() {
auto_gcroot<ClassA^> a = gcnew ClassA( "first" );
a->PrintHello();
ClassA^ a2 = a.get();
a2->PrintHello();
PrintA( a.get() );
}
in ClassA constructor:first
Hello from first A!
Hello from first A!
Hello from first A!
in ClassA destructor:first
auto_gcroot::release
Gibt das Objekt aus der auto_gcroot
Verwaltung frei.
_element_type release();
Rückgabewert
Das freigegebene Objekt.
Beispiel
// msl_auto_gcroot_release.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class ClassA {
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {
Console::WriteLine( "ClassA constructor: " + m_s );
}
~ClassA() {
Console::WriteLine( "ClassA destructor: " + m_s );
}
void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
int main()
{
ClassA^ a;
// create a new scope:
{
auto_gcroot<ClassA^> agc1 = gcnew ClassA( "first" );
auto_gcroot<ClassA^> agc2 = gcnew ClassA( "second" );
a = agc1.release();
}
// agc1 and agc2 go out of scope here
a->PrintHello();
Console::WriteLine( "done" );
}
ClassA constructor: first
ClassA constructor: second
ClassA destructor: second
Hello from first A!
done
auto_gcroot::reset
Zerstören Sie das aktuelle Objekt, und übernehmen Sie optional den Besitz eines neuen Objekts.
void reset(
_element_type _new_ptr = nullptr
);
Parameter
_new_ptr
(Optional) Das neue Objekt.
Beispiel
// msl_auto_gcroot_reset.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class ClassA {
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {
Console::WriteLine( "ClassA constructor: " + m_s );
}
~ClassA() {
Console::WriteLine( "ClassA destructor: " + m_s );
}
void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
int main()
{
auto_gcroot<ClassA^> agc1 = gcnew ClassA( "first" );
agc1->PrintHello();
ClassA^ ha = gcnew ClassA( "second" );
agc1.reset( ha ); // release first object, reference second
agc1->PrintHello();
agc1.reset(); // release second object, set to nullptr
Console::WriteLine( "done" );
}
ClassA constructor: first
Hello from first A!
ClassA constructor: second
ClassA destructor: first
Hello from second A!
ClassA destructor: second
done
auto_gcroot::swap
Tauscht Objekte mit einem anderen auto_gcroot
.
void swap(
auto_gcroot<_element_type> & _right
);
Parameter
_Rechts
Das auto_gcroot
Objekt, mit dem Objekte ausgetauscht werden sollen.
Beispiel
// msl_auto_gcroot_swap.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
int main() {
auto_gcroot<String^> s1 = "string one";
auto_gcroot<String^> s2 = "string two";
Console::WriteLine( "s1 = '{0}', s2 = '{1}'",
s1->ToString(), s2->ToString() );
s1.swap( s2 );
Console::WriteLine( "s1 = '{0}', s2 = '{1}'",
s1->ToString(), s2->ToString() );
}
s1 = 'string one', s2 = 'string two'
s1 = 'string two', s2 = 'string one'
auto_gcroot::operator->
Der Memberzugriffsoperator.
_element_type operator->() const;
Rückgabewert
Das Objekt, das umschlossen ist auto_gcroot
.
Beispiel
// msl_auto_gcroot_op_arrow.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class ClassA {
protected:
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
int m_i;
};
int main() {
auto_gcroot<ClassA^> a( gcnew ClassA( "first" ) );
a->PrintHello();
a->m_i = 5;
Console::WriteLine( "a->m_i = {0}", a->m_i );
}
Hello from first A!
a->m_i = 5
auto_gcroot::operator=
Zuweisungsoperator.
auto_gcroot<_element_type> & operator=(
_element_type _right
);
auto_gcroot<_element_type> & operator=(
auto_gcroot<_element_type> & _right
);
template<typename _other_type>
auto_gcroot<_element_type> & operator=(
auto_gcroot<_other_type> & _right
);
Parameter
_Rechts
Das Objekt oder auto_gcroot
das dem aktuellen auto_gcroot
Objekt zugewiesen werden soll.
Rückgabewert
Die aktuelle auto_gcroot
, jetzt besitzen _right
.
Beispiel
// msl_auto_gcroot_operator_equals.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class ClassA {
protected:
String^ m_s;
public:
ClassA(String^ s) : m_s(s) {
Console::WriteLine( "in ClassA constructor: " + m_s );
}
~ClassA() {
Console::WriteLine( "in ClassA destructor: " + m_s );
}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
ref class ClassB : ClassA {
public:
ClassB( String^ s ) : ClassA( s ) {}
virtual void PrintHello() new {
Console::WriteLine( "Hello from {0} B!", m_s );
}
};
int main()
{
auto_gcroot<ClassA^> a;
auto_gcroot<ClassA^> a2(gcnew ClassA( "first" ) );
a = a2; // assign from same type
a->PrintHello();
ClassA^ ha = gcnew ClassA( "second" );
a = ha; // assign from raw handle
auto_gcroot<ClassB^> b(gcnew ClassB( "third" ) );
b->PrintHello();
a = b; // assign from derived type
a->PrintHello();
Console::WriteLine("done");
}
in ClassA constructor: first
Hello from first A!
in ClassA constructor: second
in ClassA destructor: first
in ClassA constructor: third
Hello from third B!
in ClassA destructor: second
Hello from third A!
done
in ClassA destructor: third
auto_gcroot::operator auto_gcroot
Typ-Umwandlungsoperator zwischen auto_gcroot
und kompatiblen Typen.
template<typename _other_type>
operator auto_gcroot<_other_type>();
Rückgabewert
Die aktuelle auto_gcroot
Umwandlung in auto_gcroot<_other_type>
.
Beispiel
// msl_auto_gcroot_op_auto_gcroot.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
ref class ClassA {
protected:
String^ m_s;
public:
ClassA( String^ s ) : m_s( s ) {}
virtual void PrintHello() {
Console::WriteLine( "Hello from {0} A!", m_s );
}
};
ref class ClassB : ClassA {
public:
ClassB( String ^ s) : ClassA( s ) {}
virtual void PrintHello() new {
Console::WriteLine( "Hello from {0} B!", m_s );
}
};
int main() {
auto_gcroot<ClassB^> b = gcnew ClassB("first");
b->PrintHello();
auto_gcroot<ClassA^> a = (auto_gcroot<ClassA^>)b;
a->PrintHello();
}
Hello from first B!
Hello from first A!
auto_gcroot::operator bool
Operator für die Verwendung auto_gcroot
in einem bedingten Ausdruck.
operator bool() const;
Rückgabewert
true
wenn das umschlossene Objekt gültig ist; false
sonst.
Hinweise
Dieser Operator wird tatsächlich in _detail_class::_safe_bool
einen integralen Typ konvertiert, der sicherer ist als bool
weil er nicht in einen integralen Typ konvertiert werden kann.
Beispiel
// msl_auto_gcroot_operator_bool.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
int main() {
auto_gcroot<String^> s;
if ( s ) Console::WriteLine( "s is valid" );
if ( !s ) Console::WriteLine( "s is invalid" );
s = "something";
if ( s ) Console::WriteLine( "now s is valid" );
if ( !s ) Console::WriteLine( "now s is invalid" );
s.reset();
if ( s ) Console::WriteLine( "now s is valid" );
if ( !s ) Console::WriteLine( "now s is invalid" );
}
s is invalid
now s is valid
now s is invalid
auto_gcroot::operator!
Operator für die Verwendung auto_gcroot
in einem bedingten Ausdruck.
bool operator!() const;
Rückgabewert
true
wenn das umschlossene Objekt ungültig ist; false
sonst.
Beispiel
// msl_auto_gcroot_operator_not.cpp
// compile with: /clr
#include <msclr\auto_gcroot.h>
using namespace System;
using namespace msclr;
int main() {
auto_gcroot<String^> s;
if ( s ) Console::WriteLine( "s is valid" );
if ( !s ) Console::WriteLine( "s is invalid" );
s = "something";
if ( s ) Console::WriteLine( "now s is valid" );
if ( !s ) Console::WriteLine( "now s is invalid" );
s.reset();
if ( s ) Console::WriteLine( "now s is valid" );
if ( !s ) Console::WriteLine( "now s is invalid" );
}
s is invalid
now s is valid
now s is invalid