Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Automatisk resurshantering (till exempel auto_ptr klass) som kan användas för att bädda in ett virtuellt handtag i en intern typ.
Syntax
template<typename _element_type>
class auto_gcroot;
Parametrar
_element_type
Den hanterade typ som ska bäddas in.
Medlemmar
Offentliga konstruktorer
| Namn | Beskrivning |
|---|---|
| auto_gcroot::auto_gcroot | Konstruktorn auto_gcroot. |
| auto_gcroot::~auto_gcroot |
auto_gcroot destructor. |
Offentliga metoder
| Namn | Beskrivning |
|---|---|
| auto_gcroot::attach | Koppla auto_gcroot till ett objekt. |
| auto_gcroot::get | Hämtar det inneslutna objektet. |
| auto_gcroot::release | Släpper objektet från auto_gcroot hantering. |
| auto_gcroot::återställ | Förstör det aktuella ägda objektet och ta eventuellt ett nytt objekt i besittning. |
| auto_gcroot::swap | Växlar objekt med en annan auto_gcroot. |
Offentliga operatörer
| Namn | Beskrivning |
|---|---|
auto_gcroot::operator-> |
Medlemsåtkomstoperatorn. |
| auto_gcroot::operator= | Tilldelningsoperator. |
| auto_gcroot::operator auto_gcroot | Typgjuten operator mellan auto_gcroot och kompatibla typer. |
| auto_gcroot::operator bool | Operator för att använda auto_gcroot i ett villkorsuttryck. |
| auto_gcroot::operator! | Operator för att använda auto_gcroot i ett villkorsuttryck. |
Krav
rubrikfil<msclr\auto_gcroot.h>
namnområde msclr
auto_gcroot::auto_gcroot
Konstruktorn auto_gcroot.
auto_gcroot(
_element_type _ptr = nullptr
);
auto_gcroot(
auto_gcroot<_element_type> & _right
);
template<typename _other_type>
auto_gcroot(
auto_gcroot<_other_type> & _right
);
Parametrar
_ptr
Objektet som ska ägas.
_right
En befintlig auto_gcroot.
Anmärkningar
När du skapar en auto_gcroot från en befintlig auto_gcrootsläpper den befintliga auto_gcroot objektet innan ägarskapet för objektet överförs till den nya auto_gcroot.
Exempel
// 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
auto_gcroot destructor.
~auto_gcroot();
Anmärkningar
Destrukteraren förstör också det ägda objektet.
Exempel
// 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
Koppla auto_gcroot till ett objekt.
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
);
Parametrar
_right
Det objekt som ska bifogas eller en auto_gcroot som innehåller objektet som ska bifogas.
Returvärde
Den aktuella auto_gcroot.
Anmärkningar
Om _right är en auto_gcrootfrigörs ägarskapet för objektet innan objektet kopplas till den aktuella auto_gcroot.
Exempel
// 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
Hämtar det inneslutna objektet.
_element_type get() const;
Returvärde
Det inneslutna objektet.
Exempel
// 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
Släpper objektet från auto_gcroot hantering.
_element_type release();
Returvärde
Det utgivna objektet.
Exempel
// 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
Förstör det aktuella ägda objektet och ta eventuellt ett nytt objekt i besittning.
void reset(
_element_type _new_ptr = nullptr
);
Parametrar
_new_ptr
(Valfritt) Det nya objektet.
Exempel
// 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
Växlar objekt med en annan auto_gcroot.
void swap(
auto_gcroot<_element_type> & _right
);
Parametrar
_right
Den auto_gcroot som objekten ska växlas med.
Exempel
// 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->
Medlemsåtkomstoperatorn.
_element_type operator->() const;
Returvärde
Objektet som omsluts av auto_gcroot.
Exempel
// 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=
Tilldelningsoperator.
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
);
Parametrar
_right
Objektet eller auto_gcroot som ska tilldelas till den aktuella auto_gcroot.
Returvärde
Den aktuella auto_gcroot, som nu äger _right.
Exempel
// 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
Typgjuten operator mellan auto_gcroot och kompatibla typer.
template<typename _other_type>
operator auto_gcroot<_other_type>();
Returvärde
Den aktuella auto_gcroot till auto_gcroot<_other_type>.
Exempel
// 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 att använda auto_gcroot i ett villkorsuttryck.
operator bool() const;
Returvärde
true om det omslutna objektet är giltigt. false annars.
Anmärkningar
Den här operatorn konverterar faktiskt till _detail_class::_safe_bool, vilket är säkrare än bool eftersom den inte kan konverteras till en integrerad typ.
Exempel
// 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 att använda auto_gcroot i ett villkorsuttryck.
bool operator!() const;
Returvärde
true om det omslutna objektet är ogiltigt. false annars.
Exempel
// 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