Код:
class DisposeableThread;
class Disposeable
{
Disposeable* prev;
Disposeable* next;
public:
Disposeable():prev(0), next(0) {
//.code..
}
~Disposeable() {
//.code..
}
friend DisposeableThread;
}
class DisposeableThread
{
Disposeable* first;
class DisposeablePtr
{
DisposeableThread* tr;
public:
Disposeable* ptr;
DisposeablePtr(DisposeableThread* t, Disposeable* d):tr(t), ptr(d) {
if(tr->first)
tr->first->prev=ptr;
prt->next=tr->first;
tr->first=prt;
}
~DisposeablePtr(){
if(ptr->prev) {
tr->first=ptr->prev;
ptr->prev->next=ptr->next;
}
if(ptr->next)
ptr->next->prev=ptr->prev;
delete ptr;
}
}
public:
DisposeableThread():first(0) {
}
~DisposeableThread() {
while(first) {
Disposeable* t=first;
first=first->next;
delete t;
}
}
void ThreadProc() {
DisposeablePtr resource1(this, new Disposeable());
Sleep(10000);
{
DisposeablePtr resource2(this, new Disposeable());
Sleep(10000);
{
DisposeablePtr resource3(this, new Disposeable());
Sleep(10000);
}
Sleep(10000);
}
Sleep(10000);
}
}
На самом деле, возможно, стоит чуть сложнее, но в целом идея, надеюсь, ясна?
Социальные закладки