Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Não é possível declarar um tipo de handle num tipo nativo. vcclr.h fornece o modelo gcroot de wrapper de tipo seguro para se referir a um objeto CLR do heap C++. Este modelo permite incorporar um identificador virtual em um tipo nativo e tratá-lo como se fosse o tipo subjacente. Na maioria dos casos, pode utilizar o objeto gcroot como o tipo incorporado sem qualquer conversão de tipo. No entanto, com para cada um, em, você tem que usar static_cast para recuperar a referência gerenciada subjacente.
O gcroot template é implementado usando os recursos da classe de valor System::Runtime::InteropServices::GCHandle, que fornece "ponteiros" no heap gerido pela coleta de lixo. Observe que as alças em si não são lixo coletado e são liberadas quando não estão mais em uso pelo destruidor na gcroot classe (este destruidor não pode ser chamado manualmente). Se instanciar um objeto gcroot no heap nativo, deverá invocar delete nesse recurso.
O runtime manterá uma associação entre o identificador e o objeto CLR ao qual se refere. Quando o objeto CLR se move com a pilha coletada de lixo, o identificador retornará o novo endereço do objeto. Uma variável não precisa ser fixada antes de ser atribuída a um gcroot modelo.
Exemplos
Este exemplo mostra como criar um gcroot objeto na pilha nativa.
// mcpp_gcroot.cpp
// compile with: /clr
#include <vcclr.h>
using namespace System;
class CppClass {
public:
gcroot<String^> str; // can use str as if it were String^
CppClass() {}
};
int main() {
CppClass c;
c.str = gcnew String("hello");
Console::WriteLine( c.str ); // no cast required
}
hello
Este exemplo mostra como criar um gcroot objeto no heap nativo.
// mcpp_gcroot_2.cpp
// compile with: /clr
// compile with: /clr
#include <vcclr.h>
using namespace System;
struct CppClass {
gcroot<String ^> * str;
CppClass() : str(new gcroot<String ^>) {}
~CppClass() { delete str; }
};
int main() {
CppClass c;
*c.str = gcnew String("hello");
Console::WriteLine( *c.str );
}
hello
Este exemplo mostra como usar gcroot para manter referências a tipos de valor (em oposição a tipos de referência) num tipo nativo, utilizando gcroot no tipo caixa.
// mcpp_gcroot_3.cpp
// compile with: /clr
#include < vcclr.h >
using namespace System;
public value struct V {
String^ str;
};
class Native {
public:
gcroot< V^ > v_handle;
};
int main() {
Native native;
V v;
native.v_handle = v;
native.v_handle->str = "Hello";
Console::WriteLine("String in V: {0}", native.v_handle->str);
}
String in V: Hello