Утечка памяти — довольно серьезная и опасная проблема. Быть может, пользователь и не заметит однократной утечки каких-нибудь 32Кб памяти (а ведь это целые 5% от 640Кб, которых
«хватит всем»), но постоянно теряя сложные иерархические структуры или массивы размером больше
INT_MAX
(
которые мы так любим создавать на 64-битной архитектуре) мы обречем его на страдания, а наш продукт на провал.
Не допускать ситуации вроде бы и не трудно — воспользуемся правилом «класть на место всё что взяли», но на практике это сильно осложняется человеческим фактором (банальная невнимательность), хитростью архитектуры и нелинейным порядком выполнения операторов, например, из-за применения исключений.
А можно было бы просто «отдаться» автоматическому сборщику мусора, ценой потери производительности (и это не обязательно Managed C++, для Native C++ / C есть библиотеки сборки мусора,
вот, например).
Но мы поговорим о ситуации когда уже «всё плохо».