Ich habe einen erweiterbaren C ++ - Wrapper um eine sehr schwer zu verwendende, aber auch sehr nützliche C-Bibliothek geschrieben. Das Ziel ist es, c ++ für die Zuweisung des Objekts, die Offenlegung seiner Eigenschaften, die Freigabe des Objekts, das Kopieren der Semantik usw. zu nutzen.
Das Problem ist folgendes: Manchmal möchte die c-Bibliothek das zugrunde liegende Objekt (einen Zeiger auf das Objekt), und der Klassendestruktor sollte den zugrunde liegenden Speicher nicht zerstören. Während der meisten Zeit sollte der Destruktor die Zuordnung des zugrunde liegenden Objekts aufheben. Ich habe mit dem Setzen eines bool hasOwnership
Flags in der Klasse experimentiert, damit der Destruktor, der Zuweisungsoperator usw. weiß, ob er den zugrunde liegenden Speicher freigeben soll oder nicht. Dies ist jedoch für den Benutzer umständlich, und manchmal gibt es auch keine Möglichkeit zu wissen, wann ein anderer Prozess diesen Speicher verwendet.
Derzeit habe ich es so eingerichtet, dass ich das hasOwnership-Flag setze, wenn die Zuweisung von einem Zeiger des gleichen Typs wie der zugrunde liegende Typ stammt. Ich mache dasselbe, wenn der überladene Konstruktor mit dem Zeiger aus der c-Bibliothek aufgerufen wird. Dies ist jedoch immer noch nicht der Fall, wenn der Benutzer das Objekt erstellt und an eine meiner Funktionen übergeben hat, die c_api aufruft und die Bibliothek den Zeiger zur späteren Verwendung speichert. Wenn sie ihr Objekt löschen würden, würde dies zweifellos einen Segfault in der c-Bibliothek verursachen.
Gibt es ein Entwurfsmuster, das diesen Prozess vereinfachen würde? Vielleicht eine Art Referenzzählung?
unique_ptr
In den meisten Fällen kann diese Art von Ressourcen bereits verarbeitet werden, sodass Sie die Ressourcenverwaltung nicht selbst implementieren müssen. unique_ptr
verwendet die release
Methode, um das Eigentum an dem gespeicherten Objekt aufzugeben.