Ho scritto un wrapper c ++ estendibile attorno a una libreria c molto difficile da usare ma anche molto utile. L'obiettivo è avere la convenienza di c ++ per allocare l'oggetto, esporre le sue proprietà, deallocare l'oggetto, copiare la semantica ecc ...
Il problema è questo: a volte la libreria c vuole l'oggetto sottostante (un puntatore all'oggetto), e il distruttore di classe non dovrebbe distruggere la memoria sottostante. Mentre la maggior parte delle volte, il distruttore dovrebbe deallocare l'oggetto sottostante. Ho sperimentato con l'impostazione di un flag bool hasOwnership
nella classe in modo che il distruttore, l'operatore di assegnazione, ecc ... sapesse se deve o meno liberare la memoria sottostante o meno. Tuttavia, questo è ingombrante per l'utente, e inoltre, a volte non c'è modo di sapere quando un altro processo utilizzerà quella memoria.
Attualmente, ho installato dove quando il compito proviene da un puntatore dello stesso tipo del tipo sottostante, quindi ho impostato il flag hasOwnership. Faccio lo stesso quando il costruttore sovraccaricato viene chiamato usando il puntatore dalla libreria c. Tuttavia, questo ancora non gestisce il caso quando l'utente ha creato l'oggetto e lo ha passato ad una delle mie funzioni che chiama c_api e la libreria memorizza il puntatore per un uso successivo. Se dovessero cancellare il loro oggetto, allora senza dubbio causerebbe un segfault nella libreria c.
Esiste un modello di progettazione che semplificherebbe questo processo? Forse una sorta di conteggio dei riferimenti?