The intent is to create a type that not just the instances of that type are owned by the surrounding class, but the the type itself is as also owned by the surrounding class.
For an obvious example, most container types will define the iterator type for that container as a nested class (or struct). Even though vector<T>::iterator and deque<T>::iterator represent similar concepts, each is still owned by, and specific to, its associated container type.
As far as access specifiers go, they follow the usual rules -- if you make a struct/class definition private, it will only be visible to other code in the same class. If it's protected, it'll be visible to that class and its descendants. If it's public, it'll be visible to everybody.
To give a more concrete example, for positions in a business, you might have:
class secretary {};
class executive {
class secretary {};
};
In this case, a ::secretary is a "normal" secretary and an executive::secretary is an executive secretary -- although obviously similar, an executive secretary will normally a have job description that's at least somewhat different from a non-executive secretary's. An executive vice president might have one executive secretary and two "normal" secretaries, but a lower level manager is probably only authorized to have a normal secretary, not an executive secretary.
In real programming, you often have private nested classes -- unlike an executive secretary that's just different from a normal secretary, some of these are things that the rest of the world doesn't even know they exist at all (at least unless they look at the private parts of the header of course).
deleteon each pointer in that vector somewhere you have a memory leak because the vector isn't doing it (it is doing it, but for dynamically allocated pointers, not the objects themselves). I would imagine (hope) they understood this, but I cringe a bit when I see avector<SomeType*>.