Generalisierte Refcounting Lösung gesucht.
-
Hallo,
ich möchte es vermeiden Refcounting selbst zu implementieren und suche deswegen eine generalisierte Lösung.Ich möchte einen beliebigen Typ (keinen Zeiger, eine Art Handle) in einen schlauen Container stecken können, der eine von mir definierte Aktion durchführt sobald der Referenzzähler auf 0 abgesunken ist.
Da ich viele solche Objekte habe möchte ich sie nicht auf dem Heap anlegen nur um std::shared_ptr nutzen zu können. Da sie in der Regel <= sizeof(void*) sind, könnte ich sie zwar per reinterpret_cast in einen std::shared_ptr mogeln, das fände ich aber sehr hässlich.
Irgendwelche Vorschläge? Gibt es da etwas in Boost?
Danke und Grüße,
Ethon
-
Erst kürzlich habe ich einen shared_handle geschrieben.
Ich habe dort zum refcounting einfach einen shared_ptr benutzt.
-
Ethon schrieb:
Ich möchte einen beliebigen Typ (keinen Zeiger, eine Art Handle) in einen schlauen Container stecken können, der eine von mir definierte Aktion durchführt sobald der Referenzzähler auf 0 abgesunken ist.
Welcher Referenzzähler? Was willst du zählen?
-
Mir ist gerade schlagartig klar geworden, dass ohne allozierten Kontrollblock sowieso kein Refcounting möglich ist. Also könnte ich sowieso direkt make_shared nutzen, das kommt auch mit 1x Allokation aus.
Werde wohl die Objekte gruppieren und in einen shared_ptr stecken.
Danke für die Versuche zu verstehen was ich will.
-
Es gibt da noch
boost::intrusive_ptr.
-
Ethon schrieb:
Mir ist gerade schlagartig klar geworden, dass ohne allozierten Kontrollblock sowieso kein Refcounting möglich ist.
Das stimmt so nicht. Man kann die "Handles" auch untereinander in einem Ring verpointern. Allerdings ist das dann schon etwas anspruchsvoller, wenn man das threadsafe haben will.