Code von std::tr1::shared_ptr
-
Abend!
Kennt jemand eine Seite, die beispielhaft eine Implementierung von shared_ptr zeigt. Wie er arbeitet weiß ich (einigermaßen), aber ich würde gerne wissen wie man sowas implementiert. Bitte nicht auf irgend einen Boost Code vermitteln - der ist doch meistens grauenhaft.
Aber über eine schlichte (!) Implementierung eines shared_ptr würde ich mich sehr freuen!
-
Bayern@CL_Viertelfinale schrieb:
Bitte nicht auf irgend einen Boost Code vermitteln - der ist doch meistens grauenhaft.
Tja, so wirds aber aussehen. Schlicht ist die Implementierung nicht, wenn man an Dinge wie benutzerdefinierte Deleter,
weak_ptr
undenable_shared_from_this
denkt.Aber ein Smart-Pointer mit geteilter Besitzsemantik ist im Grunde genommen nicht schwierig. Im Folgenden siehst du ein mögliches Grundgerüst. Dieses sollte nur das zentrale Prinzip verdeutlichen, es könnte Bugs enthalten und von tatsächlichen Implementierungen abweichen. Schau dir doch diese auch noch an. Erkundige dich ausserdem nach "Reference Counting".
#include <algorithm> template <typename T> class shared_ptr { public: shared_ptr() : m_ptr(NULL) , m_refcount(NULL) { } explicit shared_ptr(T* pointer) : m_ptr(pointer) , m_refcount(new unsigned int(1)) { } shared_ptr(const shared_ptr& origin) : m_ptr(origin.m_ptr) , m_refcount(origin.m_refcount) { if (m_refcount != NULL) ++*m_refcount; } ~shared_ptr() { if (m_refcount != NULL && --*m_refcount == 0) { delete m_ptr; delete m_refcount; } } shared_ptr& operator= (const shared_ptr& origin) { reset(origin); return *this; } void swap(shared_ptr& other) { std::swap(m_ptr, other.m_ptr); std::swap(m_refcount, other.m_refcount); } void reset() { shared_ptr tmp; swap(tmp); } void reset(T* pointer) { shared_ptr tmp(new_pointer); swap(tmp); } void reset(const shared_ptr& origin) { shared_ptr tmp(origin); swap(tmp); } private: T* m_ptr; unsigned int* m_refcount; };
-
Bayern@CL_Viertelfinale schrieb:
Abend!
Kennt jemand eine Seite, die beispielhaft eine Implementierung von shared_ptr zeigt. Wie er arbeitet weiß ich (einigermaßen), aber ich würde gerne wissen wie man sowas implementiert. Bitte nicht auf irgend einen Boost Code vermitteln - der ist doch meistens grauenhaft.
Du willst den Code eines shared_ptr aber nicht nicht den original code vom shared_ptr. Ups. Was du in den gelieferten Bibliotheken der Compilerhersteller findest dürfte sich nicht wesentlich vom boost::shared_ptr unterscheiden, abgesehn davon dass diverse Makros fehlen dürften, die boost automatisch an die verschiedenen Compiler anpassen. Und soo grauenhaft ist der Code nun auch nicht, man muss nur zwischen den Zeilen - äääh #defines lesen
-
Nexus schrieb:
Tja, so wirds aber aussehen. Schlicht ist die Implementierung nicht, wenn man an Dinge wie benutzerdefinierte Deleter,
weak_ptr
undenable_shared_from_this
denkt.Die Verwaltung des Referenzzählers ist bei einer "richtigen" Implementierung auch Thread-sicher. Es kommst also schon einiges zusammen....