Eu escrevi um wrapper c ++ extensível em torno de uma biblioteca c muito difícil de usar, mas também muito útil. O objetivo é ter a conveniência de c ++ para alocar o objeto, expor suas propriedades, desalocar o objeto, copiar semântica, etc ...
O problema é o seguinte: às vezes a biblioteca c deseja o objeto subjacente (um ponteiro para o objeto) e o destruidor de classe não deve destruir a memória subjacente. Enquanto na maioria das vezes, o destruidor deve desalocar o objeto subjacente. Eu experimentei definir um bool hasOwnership
sinalizador na classe para que o destruidor, o operador de atribuição, etc ... saiba se deve ou não liberar a memória subjacente. No entanto, isso é complicado para o usuário e, também, às vezes não há como saber quando outro processo estará usando essa memória.
Atualmente, eu tenho a configuração onde, quando a atribuição vem de um ponteiro do mesmo tipo que o tipo subjacente, defino o sinalizador hasOwnership. Eu faço o mesmo quando o construtor sobrecarregado é chamado usando o ponteiro da biblioteca c. No entanto, isso ainda não lida com o caso em que o usuário criou o objeto e o passou para uma das minhas funções que chama c_api e a biblioteca armazena o ponteiro para uso posterior. Se eles fossem excluir seu objeto, sem dúvida causaria um segfault na biblioteca c.
Existe um padrão de design que simplifique esse processo? Talvez algum tipo de contagem de referência?
unique_ptr
na maioria dos casos, já pode lidar com esse tipo de recursos, portanto, você não precisa implementar o gerenciamento de recursos. unique_ptr
usa o release
método para abandonar a propriedade do objeto armazenado.