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 hasOwnershipsinalizador 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_ptrna maioria dos casos, já pode lidar com esse tipo de recursos, portanto, você não precisa implementar o gerenciamento de recursos. unique_ptrusa o releasemétodo para abandonar a propriedade do objeto armazenado.