wtorek, 17 marca 2009

Zliczanie referencji

Ehh, nadszedł ten dzień kiedy ostatecznie uznałem, że zliczanie referencji trzeba zrobić. Bufor tu, bufor tam. Potem ktoś ten bufor skasuje i pół aplikacji zostaje z wskaźnikiem na skasowany obiekt.
Zastosowane rozwiązanie jest oparte na wcześniejszym modelu zarządzania zasobami. Wzbogaciłem go jedynie o dodatkową klasę Handle i parę metod zliczających referencje.
Wszystkie elementy posługują się już uchwytami, a same zasoby póki co nie wychodzą poza menadżerów.

class Handle
{

friend class
Resources::Resource;
public
:
Handle(const Handle & arg);
Handle();
virtual
~Handle();

Handle & operator = (const Handle & arg);

std::string & GetName();
bool
IsCreated();

protected
:
Resource * getResource();
private
:
Handle(Resource * resource);

Resource * resource;
};


class Resource
{

friend class
Resources::ResourceFactory;
friend class
Resources::Handle;
public
:
std::string & GetName();
bool
IsCreated();
bool
Remove();
protected
:
Resource(const std::string & name, ResourceFactory & resourceFactory);
virtual
~Resource();

Handle getHandle();

void
setCreated(bool isCreated);
private
:
Resource();

void
add();
void
remove();

void
addRef();
void
removeRef();

std::string name;
ResourceFactory & resourceFactory;

bool
isCreated;
unsigned int
references;
};


typedef std::map<std::string, Resource *> ResourceMap;

class
ResourceFactory
{

friend class
Resource;
public
:
//No public interface.
protected:
ResourceFactory();
virtual
~ResourceFactory();

ResourceMap resources;
};

Brak komentarzy: