Listing 4
#include <iostream>
#include <memory>
#include <stdlib.h>
using std::auto_ptr; using std::cout;
struct resource
{ // trace resource allocation and release
resource()
{ // report allocation
cout << "resource allocated at " << (void*)this << '\n';
}
~resource()
{ // report release
cout << "resource released at " << (void*)this << '\n';
}
void do_something() const {}
};
resource *res0;
resource *res1;
auto_ptr<resource> res2;
void init_resources()
{ // allocate three resource objects
if (!res0)
res0 = new resource;
if (!res1)
res1 = new resource;
if (!res2.get())
res2 = auto_ptr<resource>(new resource);
}
void release_res0()
{ // release resource pointed to by res0
delete res0;
}
struct release_res1
{ // release resource pointed to by res1
~release_res1() { delete res1; }
};
release_res1 rel1;
void use_resources()
{ // use both resources
init_resources();
res0->do_something();
res1->do_something();
}
void use_one_resource()
{ // use one resource
if (!res0)
res0 = new resource;
res0->do_something();
}
int main()
{ // use managed resources
atexit(release_res0);
use_one_resource();
use_resources();
return 0;
}