It's usually lack of garbage collection that gets to me the fastest. Closures are a close second, but those you can easily fake in nearly any language. In Java, anonymous classes usually do the job. In C with GNU extensions, you can use nested functions as callbacks, with the caveat that they'll only be available within the dynamic scope of the caller.
Granted, it's not garbage collection, but sometimes you have to write C++ and boost makes that manageable. boost::shared_ptr is based on refcounts, so you need to be aware of cycles and use boost::weak_ptr accordingly.