boost::shared_ptr ptr( new T, std::mem_fun_ref(&T::deleteMe) ); boost::shared_ptr ptr( new S, std::ptr_fun(lib_freeXYZ) ); void Deleter( T* ptr); boost::shared_ptr ptrToT( new T, Deleter ); void Deleter( T* ptr); { ptr->deleteMe(); // And make sure YOU ACTUALLY DELETE (or do whatever else you need to // do to release the resource) delete ptr; } void intrusive_ptr_add_ref(foo *f) { lib_add_ref(f); } void intrusive_ptr_release(foo *f) { if(lib_dec_ref(f) == 0) lib_free(f); } intrusive_ptr f(lib_alloc()); // can wrap raw pointers too, which already may be referenced somewhere else foo *p = get_foo_from_somewhere(); function_taking_intrusive_ptr(p);