The null_deleter docs could also explain that it it useful when you don't have a dynamically allocated object at all. For example
struct impl { ... };
shared_ptr<impl> get_default_impl()
{
static impl def;
return shared_ptr<impl>( &def, null_deleter );
}