C++'s destructors are great for ensuring that resources get cleaned up at the end of a scope, but writing wrapper classes for every damn C library type you use gets tired real quick. Slava suggested that I write a template class to do it once, so guess what? I did. 
template<typename T>
struct finally {
    typedef T value_type;
    typedef boost::function<void (T)> destructor_type;
    T object;
    destructor_type destructor;
    finally(T o, destructor_type d) : object(o), destructor(d) {}
    ~finally() { destructor(object); }
};
With finally in your toolbox, whenever you need to toss a fopen, malloc, or other C resource acquisition in, you don't need to give up exception safety anymore!
{
    FILE *f = fopen("foo", "r");
    finally<FILE*> close_f(f, fclose);
}
{
    void *buf = malloc(17);
    finally<void*> free_buf(buf, free);
}
{
    PGconn *conn = PQconnectdb(conninfo);
    finally<PGconn*> finish_conn(conn, PQfinish);
}
Because finally uses boost::function to hold the destructor function, it works with functor objects and functions that don't return void.
UPDATE: kefex on reddit points out that boost::shared_ptr does this already:
boost::shared_ptr<FILE> pf(fopen("foo", "r"), fclose);