Zapowiadalem, ze bedzie - no i jest. Nowy odsmiecacz dla C++. Dla tych, ktorzy nie wiedza, co to jest (a z ankiety wynikalo, ze to jakies 50% uzytkownikow tego forum) krotki opis, jak to dziala.


Uzywanie dynamicznego przydzialu pamieci w C++ powoduje jak wiadomo (np. z ankiety)
sporo problemow. Czesto pojawiaja sie niemile bledy dostepu do pamieci, zwykle spowodowane wskaznikami wskazujacymi do nikad. Wskazniki takie moga powstac np. przez usuniecie obiektu, ktory jest jeszcze dostepny za posrednictwem innego wskaznika. Inny problem moze powodowac niezwolnienie jakiegos obiektu i zgubienie wskaznikow do niego albo proba zwolnienia tej samej pamieci 2 razy. Z tego powodu programisci staraja sie unikac dynamicznej alokacji pamieci. Niestety w duzych programach jest to bardzo trudne (a raczej nawet niemozliwe).

Rozwiazanie problemu jest proste. Odsmiecacz to specjalny modul, ktory pozwala programiscie zapomniec o zwalnianiu pamieci. Innymi slowy mozna uzywac sobie funkcji new/malloc do woli i nigdy nie wywolywac delete/free. W ten sposob nie ma okazji utworzenia "wiszacego wskaznika" i nie ma ryzyka popelnienia bledu. A co jesli pamiec sie skonczy? Nie skonczy sie, bo nad tym panuje odsmiecacz. Odsmiecacz wyszukuje niedostepne (czyli nieuzywane) obiekty i je usuwa. Nie ma ryzyka, ze usunie obiekt, do ktorego istnieje gdzies wskaznik, nie ma tez ryzyka, ze usunie jakis obiekt 2 razy. Nie potrzebujesz jakiegos obiektu? Gubisz do niego wskaznik i po klopocie. Pamiec sie nie zmarnuje.

Niektorzy uwazaja, ze uzywanie odsmiecacza spowalnia programy. Badania pokazuja jednak cos zupelnie innego. Niedowiarkow odsylam tu: http://www.hpl.hp.com/personal/Hans_Boehm/gc/myths.ps

Odsmiecacz, ktory napisalem (jest czescia wiekszej pracy) jest przede wszystkim latwy w instalacji oraz ma te przyjemna ceche, ze mozna go stosowac w aplikacjach interaktywnych i "soft real time". Czyli nie ma tego efektu co w Javie, ze aplikacja zamiera na pol sekundy, bo sie wlaczylo System.gc(). Reszta zalet jest wypisana w dokumentacji, nie chce mi sie tego wszystkiego tu przepisywac...

Biblioteka jest jeszcze w wersji beta i bylo by mi bardzo milo, gdyby ktos zechcial sie tym troche pobawic i wyslac mi swoje uwagi. Moze jakies bledy znajdzie, albo benchmark zrobi?
Mozecie jej uzywac do woli do wlasnych celow (ale nie w projektach komercyjnych: licencja GPL). Aha. Ktos moglby jakis port na Windows zrobic. Glupi Windows nie ma POSIX Threads. [glowa] Uruchamialem to na Linuksie (2.4) i OpenBSD (3.3 i 3.4).

Stad mozna to sciagnac: http://www.kopernik.edu.pl/~pkolaczk/</url>