В общем, избегайте выделения из кучи, если вам не нужно. Если вам нужно, используйте подсчет ссылок для объектов, которые являются долговечными и должны быть разделены между различными частями вашего кода.
Иногда вам нужно выделять объекты динамически, но они будут использоваться только в течение определенного промежутка времени. Например, в предыдущем проекте мне нужно было создать сложное представление в памяти схемы базы данных - в основном сложный циклический график объектов. Тем не менее, график нужен только для продолжительности соединения с базой данных, после чего все узлы могут быть освобождены одним выстрелом. В этом сценарии хороший шаблон для использования - это то, что я называю «локальным GC-идиомой». Я не уверен, имеет ли это «официальное» имя, поскольку это то, что я видел только в своем собственном коде и в Cocoa (см. NSAutoreleasePool в справочнике Apple по какао).
В двух словах вы создаете объект «collector», который хранит указатели на временные объекты, которые вы выделяете с помощью нового. Обычно это привязано к определенной области вашей программы, либо статической области (например, как объект, выделенный стекю, который реализует идиому RAII), либо динамический (например, привязанный к времени жизни соединения с базой данных, как в мой предыдущий проект). Когда объект «collector» освобождается, его деструктор освобождает все объекты, на которые он указывает.
Кроме того, как и DrPizza, я считаю, что ограничение на использование шаблонов слишком суровое. Тем не менее, проведя большую разработку в древних версиях Solaris, AIX и HP-UX (совсем недавно - да, эти платформы все еще живы в Fortune 50), могу вам сказать, что если вы действительно заботитесь о переносимости, вы должен использовать шаблоны как можно меньше. Использование их для контейнеров и интеллектуальных указателей должно быть в порядке, хотя (это сработало для меня). Без шаблонов техника, которую я описал, более болезненна для реализации. Это потребует, чтобы все объекты, управляемые «сборщиком», были получены из общего базового класса.
Жаль, что это так давно. Мне бы хотелось услышать объяснение, почему вы не можете использовать (в частности) дженерики. – jmucchiello 2009-04-27 01:43:55
Из документации рамки: Не используйте шаблоны. Они не переносимы в разные операционные системы, особенно в том случае, если они поддерживаются компиляторами и редакторами ссылок. В настоящее время все, что я могу сказать об этом – 2009-04-27 11:13:59
Шаблоны были хорошо поддержаны в разных операционных системах в 2009 году, при условии, что у этих ОС практически нет доступных компиляторов. Любой, кто пишет структуру, должен был придумать некоторые фактические доказательства своей претензии. – 2017-01-17 01:15:20