ProfilWeblogVokabelnSpielchenQuizBücherwurm gRayman.de

Kategorien

Siehe auch

Style

Anzeigen

Alle Einnahmen von den folgenden Anzeigen werden an die Deutsche Krebshilfe gespendet.

RSS 0.91

20. März 2004

/cplusplus
Garbage Collection – Teil 2: Hierarchische Referenzzählung  

Im ersten Teil dieses Artikels beschrieb ich das einfache Zählen der Referenzen, mit der man unreferenzierte Objekte erkennen und löschen kann. Objekte können sich jedoch zyklisch referenzieren und so kann es referenzierte aber dennoch unerreichbare Objekte geben, die durch einfaches Zählen der Referenzen nicht zu entdecken sind.

In diesem Teil beschreibe ich, wie man die zyklischen Referenzen in bestimmten Situationen vermeiden kann und so das Problem umgehen kann.

Mehr ...

0 Kommentar(e) permalink

25. Februar 2004

/cplusplus
Garbage Collection – Teil 1: Einführung  

C++ bietet standardmäßig keine automatische Speicherverwaltung. C++ ermöglicht die Verwaltung von dynamischem Speicher unter anderem mit den Operatoren new und delete. Objekte, die mit new angelegt werden, müssen mit delete explizit freigegeben werden.

Als kleine Übung in C++ habe ich eine einfache Garbage Collection implementiert. Sie hat nicht alle Fähigkeiten der Speicherverwaltung von Java oder von C#, dass würde den Rahmen einer Übung sprengen, dafür ist sie aber ziemlich einfach und erfüllt die für mich wichtigste Aufgabe einer Garbage Collection – die nicht erreichbaren Objekte zu löschen.

Mehr ...

0 Kommentar(e) permalink

06. Oktober 2003

/cplusplus
Bag  

Wenn ich das ->Observer Pattern in C++ implementieren möchte, brauche ich einen Container, in dem das Subjekt die Pointer auf die Observer verwaltet. Auf diesen Container habe ich folgende Anforderungen:

  • Einfügen und Rausnehmen der Elemente soll schnell sein
  • Da ein Observer sich während einer Nachricht vernichten kann, sollte das Rausnehmen aus dem Container auch während einer Iteration möglich sein
  • Ein Observer kann selbst Subject sein, und so kann es passieren, dass A an B sendet, B an C und C wieder an A. Damit sollte der Container klarkommen.
  • Unbehandelte Exceptions während der Iteration dürfen die Iteration abbrechen, den Container aber nicht in einen ungültigen Zustand versetzen

Hier eine einfache Lösung. Bag ist ein Contaier, das während der Iteration modifiziert werden kann. Herausgenommene Elemente bekommen garantiert keine Nachrichten mehr. Reihenfolge, in der die Iteration stattfindet ist nicht deffiniert.

Obwohl man in dem Container nicht nach den Elementen suchen kann, passiert das Einfügen und Rausnehmen der Elemente in konstanter Zeit. Jedes Eingefügte Element bekommt nämlich ein „Abo“ das seine Position in dem Container bestimmt. Um aus dem Container herausgenommen zu werden, muss das „Abo“ abbestelt werden. Ein Element könnte auch mehrfach in einem Bag vorhanden sein, dann würde es jede Nachricht mehrfach bekommen.

Die Quelltexte kann man hier downloaden. Um Bag zu benutzen, sind nur die Dateien bag.cpp und bag.h nötig. Die anderen Quelltexte beinhalten die gebraucheten Unit-Tests. Um die kompilieren zu können, braucht man das Testframework ->CppUnit

Die Quelltexte sind Open Source (BSD-Lizenz)

0 Kommentar(e) permalink

      Impressum:  Gregor Raýman · Auf dem Kirchbüchel 3 · D-53127 Bonn Kontakt: webmaster@grayman.de         Valid HTML 4.01! Valid HTML 4.01! .