What you're seeing isn't a memory leak, it's just the working set of the process changing. Unfortunately what task manager calls memory is just the private working set of the process and not showing you what you think you're seeing.
Now, a far bigger problem. Why on earth are you using pointers to shared pointers? If that doesn't confuse you (or people maintaining your code after you) then nothing will. You're probably not doing what you think you're doing (whatever that is).
So you can make your code a lot simpler by eliminating the shared_ptrs AND just using values in your vector. Unless of course ABCD is an interface class in which case keep it but get rid of all the manual memory management rubbish (apart from the new). Something like:
std::vector<abcd> foo;
void populate_vector()
{
foo = std::vector<abcd>( 200 );
}
void delete_vector()
{
foo.clear();
}
Cheers,
Ash