Occasionally, the book-keeping to make sure you're able to clean up each allocation individually can be higher than the overhead of garbage collection. Of course, if you're working in C, you can just add garbage collection, either globally (Boehm collector, say, though I don't know how well it actually performs) or only for some particular resources (though then you do need to be sure you are tracking your roots appropriately).
I always find it amusing when I write something that spends a bunch of work making sure everything is freed before it exits. (It's worth doing so valgrind can help you be more confident you're freeing what should be freed as you go along.)