Можно код? Я не понял.
Очередь заданий:
Код:
// класс задание или действие
class TAction
{
public:
virtual ~TAction() {}
virtual void fire() = 0;
};
// список заданий (exception-safe)
class TActionList
{
typedef std::vector<TAction*>::iterator iter;
std::vector<TAction*> fitems;
void _remove(iter a, iter b)
{
for(iter c=a; a!=b; ++c) delete *c;
fitems.erase(a,b);
}
public:
~TActionList() {clear();}
void add(TAction* a) {fitems.push_back(a);}
void remove(TAction* a) {_remove(std::remove(fitems.begin(), fitems.end(), a));}
void clear() {_remove(fitems.begin(), fitems.end());}
void fire() {for(iter a=fitems.begin(), b=fitems.end(); a!=b; ++b) (*a)->fire();}
};
// класс, управляющий жизнью объектов
// TObject::execute() можно вызывать только один раз при запуске программы
class TObject
{
static TActionList fcleanup;
static void processTasks();
static void cleanup() {fcleanup.fire(); fcleanup.clear();}
public:
static void execute();
static void registerCleanup(TAction* a) {fcleanup.add(a);}
}
TActionList TObject::fcleanup;
void TObject::execute()
{
while (waitTask())
{
processTasks(); // каким-нибудь образом вызывает A::foo();
cleanup(); // такой доступ к cleanup() гарантирует, что в стеке ничего от A:: не запущено
}
}
...
// где-нибудь в программе:
std::auto_ptr<A> behavior;
void A::foo()
{
struct cleanup_A
{
void fire() { clog << "cleanup_A" << end;}
cleanup_A(A* a) : fcleanup(a);
private:
std::auto_ptr<A> fcleanup;
}
std::auto_ptr<A> b(new B(...));
std::auto_ptr<cleanup_A> clean_a(new cleanup_A(behavior.get()));
TObject::registerCleanup(clean_a.get());
clean_a.release(); // non-throwing
behavior.release(); // non-throwing
behavior = b; // non-throwing
}
Эффект кода подобен чистильщику java, только чистит когда делать нечего, а не когда память кончилась
Для полной картины, хорошо бы добавить A::unlink(), которая убирает связи ещё живого A с другими объектами.