В общем, избегайте выделения из кучи, если в этом нет необходимости. При необходимости используйте подсчет ссылок для объектов с длительным сроком службы, которые необходимо разделить между различными частями кода.
Иногда вам нужно размещать объекты динамически, но они будут использоваться только в течение определенного промежутка времени. Например, в предыдущем проекте мне нужно было создать сложное представление схемы базы данных в памяти - в основном сложный циклический граф объектов. Однако график был необходим только на время соединения с базой данных, после чего все узлы могли быть освобождены за один раз. В этом сценарии хорошим примером для использования является то, что я называю «идиома локального GC». Я не уверен, имеет ли оно «официальное» имя, поскольку я видел его только в своем коде и в Какао (см. NSAutoreleasePool в справочнике Apple по какао).
В двух словах, вы создаете объект "сборщик", который сохраняет указатели на временные объекты, которые вы выделяете с помощью new. Обычно он привязан к некоторой области в вашей программе, либо к статической области (например, как объект, выделенный в стеке, который реализует идиому RAII), либо к динамической области (например, привязанной к времени жизни соединения с базой данных, как в мой предыдущий проект). Когда объект "сборщик" освобожден, его деструктор освобождает все объекты, на которые он указывает.
Также, как и DrPizza, я считаю, что ограничение не использовать шаблоны слишком жесткое. Тем не менее, проделав большую разработку для старых версий Solaris, AIX и HP-UX (совсем недавно - да, эти платформы все еще живы в Fortune 50), я могу сказать вам, что если вы действительно заботитесь о переносимости, вы следует использовать шаблоны как можно меньше. Тем не менее, использование их для контейнеров и умных указателей должно быть в порядке (у меня это сработало). Без шаблонов описанная мной техника более болезненна для реализации. Для этого потребуется, чтобы все объекты, управляемые «сборщиком», происходили из общего базового класса.