Eigenen GarbageCollector bauen, nur wie?



  • Hallo Leute!
    Seit ein paar Tagen siniere ich darüber, wie man in C++ wohl einen eigenen Garbage-Collector schreiben könnte. Bisher ist mir kein besserer Ansatz eingefallen, als den new Operator, für alle Objekte die der GC kontrollieren soll, zu überschreiben. Habt ihr vielleicht nen besseren Ansatz, der universell anwendbar (also auch auf STL etc.) ist? Smart-Pointer will ich eigentlich weniger benutzen, aber da werd ich wahrscheinlich nicht drumrum kommen.

    freudig eure Tips erwartend,
    Sunnyboy



  • Hm, ich habe gehört, dass man Boost::shared_ptr sehr nützlich ist. Man kann es auch in STL Konteinern speichern, was auch sehr günstig ist.



  • EDIT: murks...
    NOCHMAL EDIT: mit "murks" meine ich meinen eigenen beitrag, den ich im vorherigen edit wieder gelöscht habe 😉

    aber um smart pointer wirst du wirklich nicht rum kommen.



  • Als Alternative zum klassenspezifischen operator new würde mir nur einfallen, den globalen ::operator new zu überschreiben, damit er sich um das Aufräumen kümmert (aber das dürfte etwas Overkill sein).



  • Wenn man sauber programmiert ist ein Garbage-Collector eigentlich nicht notwendig und frißt nur brav Resourcen.
    Ansonsten gibts auch in C++ managed code im Zusammenspiel mit .Net.



  • operator new() überschreiben ist ja nur die eine Hälfte der Geschichte. Die andere - und schlimmere! - ist, herauszufinden, wann ein Speicherfetzen wieder freigegeben werden kann. Das ist nur was für die ganz, ganz Harten 😉

    Man müsste über sämtlichen aktuell reservierten Speicher (einschließlich Stack!) iterieren und nachsehen, ob ein Pointer, der mit new() vergeben wurde dort auftaucht. Falls nicht, kann man den Speicher freigeben. Selbst das ist nicht sicher und auch nicht 100% zuverlässig.

    Also ich nehme lieber Smart-Pointer....

    Stefan.



  • Es gibt ja GCs für C++, z.B. von HP (der bekannteste):

    http://www.hpl.hp.com/personal/Hans_Boehm/gc/

    http://www.grayman.de/blog/cplusplus/garbage-collection-1.html
    http://www.codeproject.com/cpp/gc.asp

    Laut Bjarne Stroustrup wird im ISO C++ Committee darüber diskutiert, ob man GCs im nächsten Standard nicht als wählbare Option vorschreibt. Soll heißen, ein C++ Programm muß nicht aber soll einen benutzen können.

    Smart-Pointers sind keine GCs und können ihn auch nicht ersetzen. Klar, sie sorgen dafür, das man sie nicht mehr selber verwalten muß und sie geben sich selber frei. Aber ein GCs reorganisiert zus. die Objekte im Speicher, er defragmentiert also. Was zwar gut ist aber Performance kosten kann.


Anmelden zum Antworten