Reasons can be dangling/uninitialized pointers that are dereferenced, invalid iterators, array out-of-bound access, ... just undefined behavior.
Generally these are all things of which a big part can be avoided when you follow some design rules and avoid low-level mechanisms. For example, use std::tr1::array or std::vector instead of raw arrays, don't manage memory manually (new and delete), don't use pointers when you can as well use objects, ensure object validity wherever possible, keep visibility and accessibility as local as possible.
There are also books like "Effective C++" that explain programming guidelines in detail.