1. Yes, the vector will be destroyed. CElement's will be destroyed if the vector held the last reference to them.
2. Circular reference is the only possibility for a leak (unless you manipulate the implementation details of the pointer, e.g. artificially manually unsupportedly icnreasing the reference count)
3. You might access an already-destroyed element when you violate the once-shared-always-shared rule:
boost__shared_ptr<a> aptr(new a);
a * pa = aptr.get();
boost::shared_ptr<a> aptr2(pa); aptr2.reset();
Note that this is OK with intrusive_ptr.
4. Yes, the same rules for vector apply: if you call resize (or the sizing constructor), default constructed elements will be appended. reserve with reserve the memorys without constructing the elements.
Note that without reserve, the reallocations still happen - but at least the copies are cheap.