AutoPtr em C ++ / modo misto CLI
-
16-09-2019 - |
Pergunta
Eu tenho um C ++ / CLI invólucro .lib torno nativa e .h arquivos. Eu uso a classe AutoPtr bastante extensivamente na classe wrapper para gerenciar os objetos não gerenciados que crio para envolver. Eu atingido um obstáculo com o / operador de atribuição de cópia construtor.
Usando a classe AutoPtr do Sr. Kerr: http: //weblogs.asp.net/kennykerr/archive/2007/03/26/AutoPtr.aspx
Ele sugere a seguinte (nos comentários) para recriar o comportamento do operador de atribuição:
SomeManagedClass->NativePointer.Reset(new NativeType);
O que eu acredito é verdade. Mas quando eu compilar meu código:
ByteMessageWrap (const ByteMessageWrap% rhs)
{
AutoPtr<ByteMessage> m_NativeByteMessage(rhs.m_NativeByteMessage.GetPointer());
};
ByteMessageWrap% operator=(const ByteMessageWrap% rhs)
{
//SomeManagedClass->NativePointer.Reset(new NativeType);
if (this == %rhs) // prevent assignment to self
return *this;
this->m_NativeByteMessage.Reset(rhs.m_NativeByteMessage.GetPointer());
return *this;
};
- Eu recebo os seguintes erros:
C2662 de erro: 'WrapTest :: AutoPtr :: GetPointer': Não é possível converter 'this' ponteiro de 'Const WrapTest :: AutoPtr' para 'WrapTest :: AutoPtr%'
Alguém já experimentou problemas semelhantes?
Para mais fundo na resposta, eu removi a palavra-chave "const" a partir da assinatura. Eu sei que não é sorriu em cima em termos de correção de código para um ctor cópia, mas o CLR não gosto nada disso - uma espécie de desmente o CLR em seu núcleo com o gerenciamento de memória.
Gostaria de saber se é possível deixar a const na assinatura e, em seguida, usar GCHandle ou pin_ptr para se certificar de memória não se move em você durante a realização da cópia?
Solução
Olhando para AutoPtr de Kenny Kerr, que transfere a propriedade em seu construtor - essencialmente um construtor "movimento" em vez de um construtor de cópia. Isto é análogo com std :: auto_ptr.
Se você realmente quer transferir a propriedade de RHS para este (ou seja, rhs sair sem ele NativeByteMessage), você precisa mudar sua ctor cópia em um ctor movimento.
Além disso, você precisa usar a sintaxe de inicialização;
// warning - code below doesn't work
ByteMessageWrap (ByteMessageWrap% rhs)
: m_NativeByteMessage(rhs.m_NativeByteMessage); // take ownership
{
}
ByteMessageWrap% operator=(ByteMessageWrap% rhs)
{
//SomeManagedClass->NativePointer.Reset(new NativeType);
if (this == %rhs) // prevent assignment to self
return *this;
m_NativeByteMessage.Reset(rhs.m_NativeByteMessage.Release());
return *this;
}