При проектировании максимально использовать автоматическое (стековое) распределение .Всякий раз, когда вам нужно продлить срок службы объекта за пределы определенной области, динамически выделяйте его.
И даже в этом случае никогда не выделяйте вещи динамически raw .Всегда храните их в какой-то оболочке, которая реализует Scope-Bound Resource Management (SBRM, впервые известную под тупым / неуклюжим именем Resource-Acquisition Is Initialization или RAII.) То есть динамические выделения должны храниться в автоматических объектах, которые будут очищатьup автоматически!
Хорошим примером этого является std::vector
: вы не можете утечь внутреннюю память до vector
, потому что его деструктор запускается в каждом сценарии, когда память должна быть свободна, и он будетосвободи это для тебя.auto_ptr
- это первый и единственный интеллектуальный указатель, доступный в стандартной библиотеке, но это довольно плохо.Лучше использовать shared_ptr
, либо многие другие популярные интеллектуальные указатели, доступные в Boost и / или TR1 и / или C ++ 0x.
С точки зрения производительности объекты, расположенные в стеке, можно сделать так очень быстро (размер стека увеличивается для каждого вызова функции, поэтому вся необходимая память была выделена заранее простым движением указателя.) Напротив, динамическое выделение обычно требует гораздо больше времени.Вполне возможно получить быстрое динамическое распределение с помощью пользовательских схем размещения, но даже лучшее из них будет медленнее, чем распределение в стеке.
Иногда вы можете обнаружить, что тратите слишком много времени на копирование объектов.В этом случае, возможно, стоит динамически распределить его и просто перемещать указатели.Тем не менее, обратите внимание, я сказал «найти».Подобные изменения можно найти, профилировав и измерив, не угадав.
Итак: автоматическое распределение, когда это возможно, динамическое распределение, когда это необходимо.