You can probably put all the problems you've all described down to bad memory handling.
Here's what I advise:
1. Avoid memory allocation.
Use the STL structures provided if you need dynamic allocation - That's what they are there for. If what you want isn't provided by the STL, check out boost.
2. When you can't avoid memory allocation, wrap it in a class.
Make sure the class is either non-copyable (boost: see below), or make sure that it can be copied properly (ie, give it copy constructor, assignment operator and a destructor, and make sure they work correctly).
3. When a class is too 'heavy', use a smart pointer.
... such as provided in the boost libraries.
http://www.boost.org/
Most of the boost libraries are header-only and don't need you to build any anything ahead of time to use them.
boost::noncopyable - inherit from this class privately and you can't accidentally copy your class.
boost::shared_ptr for shared pointers where you want to pass them around, but don't want to determine for yourself when the object pointed to should be deleted.
boost::scoped_ptr for local allocation of objects - only one copy of the pointer is available and it automatically cleans up when it goes out of scope.
boost::ptr_vector and others - store pointers in vectors, maps, linked lists etc but access them as if they were not pointers.