[C++] std::shared_ptr und protected destructor

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Matthias Gubisch
Establishment
Beiträge: 507
Registriert: 01.03.2009, 19:09

[C++] std::shared_ptr und protected destructor

Beitrag von Matthias Gubisch »

ich habe eine Klasse die aussieht wie unten
also protected constructor und public release methode (die neben ein paar anderen dingen auch den d'tor aufruft)

Code: Alles auswählen

class foo
{
public:
	foo();
	void Release();
protected:
	~foo();
};
Diese Klasse kann ich nicht änderen da sie aus einer externen Lib kommt.
Diese Klasse möchte/muss ich nun in einen std::shared_ptr verpacken. Bei meinem naiven Ansatz wie unten sagt mir der Compiler dass er auf den protected destructor nicht zugreifen kann (was ja auch logisch ist)

Code: Alles auswählen

std::shared_ptr<foo> fooptr = std::shared_ptr<foo>(new foo());
Wie löst man soetwas am sinnvollsten?

Meine bisherigen recheren haben leider noch nicht wirklich sinnvolle Ergebnise geliefert, uns ausserdem würde ich gerne wissen wie hier der standardkonforme Weg wäre
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Matthias Gubisch
Establishment
Beiträge: 507
Registriert: 01.03.2009, 19:09

Re: [C++] std::shared_ptr und protected destructor

Beitrag von Matthias Gubisch »

Danke das scheint weiterzuhelfen :)

Hatte wohl nur die falschen Suchbegriffe für google :)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] std::shared_ptr und protected destructor

Beitrag von dot »

Was genau tut Release, wenn du das Objekt doch selbst mit new anlegst!?
Matthias Gubisch
Establishment
Beiträge: 507
Registriert: 01.03.2009, 19:09

Re: [C++] std::shared_ptr und protected destructor

Beitrag von Matthias Gubisch »

Da die Klasse aus einer externen library kommt, die noch dazu closed Source ist kann ich dir die Frage leider nicht beantworten.

Die Doku der lib sagt dazu auch nur dass das Objekt mittels Release freigegeben werden muss und nicht mittels Destructor.
Vermutlich werden da noch offene Verbindungen geschlossen oder ähnliches, aber genaueres weiß ich leider nicht.
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Benutzeravatar
Jonathan
Establishment
Beiträge: 2661
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: [C++] std::shared_ptr und protected destructor

Beitrag von Jonathan »

Ja wäre gut möglich, dass da im Hintergrund irgendwas abläuft, was ein bisschen länger dauern kann (warten auf Antwort oder so) und deshalb von einem internen Manager der Bibliothek übernommen wird, in das sich das Objekt beim erstellen einträgt.

(Die Richtigen Stichworte zu finden, geht leichter, wenn man weiß was genau man sucht. Ich kannte diesen Deleter-Parameter, habs aber noch nie selber benutzt).
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
Benutzeravatar
dot
Establishment
Beiträge: 1746
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [C++] std::shared_ptr und protected destructor

Beitrag von dot »

Worauf ich hinaus wollte: Wenn du nicht gerade tatsächlich shared Ownership Verhältnisse hast, ist shared_ptr schonmal keine gute Idee. Wenn du einfach nur einen generellen Smartpointer suchst, dann nimm besser unique_ptr (hat auch einen Deleter). Wenn du tatsächlich einen der äußerst seltenen Fälle hast, wo shared_ptr wirklich eine gute Idee ist, dann ist es ratsam, wann immer möglich std::make_shared() zu verwenden (geht leider nicht mit einem custom Deleter), statt das Objekt direkt mit new anzulegen. Und wenn dein Objekt schon einen eingebauten Referenzzähler hat, z.B. weil es sich um ein COM Objekt handelt, dann brauchst du niemals shared_ptr und solltest besser sowas wie boost::intrusive_ptr verwenden...
Matthias Gubisch
Establishment
Beiträge: 507
Registriert: 01.03.2009, 19:09

Re: [C++] std::shared_ptr und protected destructor

Beitrag von Matthias Gubisch »

Danke für die vielen Hinweise :)

Ist dann letztendlich ein unique_ptr geworden, shared brauche ich in dem Fall tatsächlich nicht unbedingt.

Man lernt halt immer noch was dazu :)

Ob das Objekt einen Refernzzähler hat weiß ich nicht, die Doku sagt auf alle Fälle nix davon.

@Jonathan: ich kannte die leider nicht, und wenn man nach shared_ptr und protected destructor sucht findet man wenig sinnvolles ;)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Antworten