Gli smart pointer da quello che ho capito sono intrusivi(scusate se non conosco bene i termini , al limite correggetemi), ho una classe base CObject da cui derivano tutte le classi grafiche , e questa classe base ha un counter reference.
Gli smart pointer son intrusivi se e solo se il counter reference è all'interno della classe gestita. Nel tuo casono sono di titpo intrusive, ma gli shared_ptr non sono intrusivi. Esistono poi altre variazioni sul tema come gli smart pointer ciclici basati su liste (Loki mi pare ne abbia uno), oppure smart pointer con possesso esclusivo (std::unique_ptr ad esempio).

1) Esatto. L'idea di fondo è di evitare un doppio delete con esiti catastrofici.

2) E perché dovresti farlo? Sarà "smart" per qualcosa no?

3) Puoi invocare il metodo reset() senza argomenti. Comunque nel caso degli shared_pointer puoi usare quelli forniti dal compilatore ( VC++ 2008 sp1 e VC++ 2010 hanno la loro implementazione).
Quelli di boost (che hanno dato l'incipit) tra un pò saranno solo per compatibilità con codice che già ne fa uso e non si vuole più toccare.