Yes, I know, I've encountered many things like that as well. It might be better to put it like this:"Sure, it might beat hard to find (mostly C++) memory leaks, but if you make it into a habit of writing the free statement right after the create, you just solved that problem. And some profiling will take care of the rest."
Things are rarely that simple in real applications.
Personally I've written millions of lines of assembler and probably 10's of millions of lines of C/C++, I'm very aware of the errors people make and I still don't write error free memory management code 100% of the time.
The obvious traditional issue in games is a messaging system, mesaging systems usually keep lists of recipients, but while walking the list of recipients and sending the messages recipients in the list can be created or destroyed. The messaging system doesn't usually own the objects, but it makes the implementation an order of magnitude easier, if it at least partially owns them.
There's always the ownrship questions between the "Game object manager" and the hierarchy of in game objects. It invariable leads to notification patterns, weak pointers etc etc.
And that's before you get into 3rd party libraries or just internal code written by someone else with unclear memory management semantics.
"First figure out the lifecycle of objects and write the code to create, handle and dispose them, before actually using them."
There are lots of border cases, but I tend to always create a manager for each (class of) object(s). And yes, COM objects (or in general everything using an interface), a factory or library that isn't very specific in who creates/owns/disposes anything is a pain to manage.