Если вы хотите избежать утечек памяти, не используйте delete
.
Это может показаться парадоксальным, но правда в том, что ручное управление памятью подвержено ошибкам, лучше использовать автоматическое (илибиблиотека) technics.
В C ++ для каждого создаваемого вами объекта должно быть четкое владение.То есть вы должны быть в состоянии определить время жизни объекта, возможно, в зависимости от некоторых других.
Первый шаг - избежать динамического выделения памяти: если вы не используете new
, у вас ничего нетуправлять - предостережение: какая-то библиотека передаст вам память и ожидает, что вы освободите ее .Поэтому, когда это возможно, использует стек .
Многого использования new
можно избежать, используя контейнеры STL (например, std::vector<T>
) вместо того, чтобы переходить в собственные ситуации.
Второй шаг - экономно использовать new
и всегда передавать память одному владельцу сразу после ее выделения.К таким владельцам относятся:
std::unique_ptr
(C ++ 0x) или boost::scoped_ptr
, в крайнем случае std::auto_ptr
. boost::ptr_vector
и вся коллекция Boost.Pointer Container library
Один владелец легко отследить, и поскольку время жизни объекта привязано к его владельцу, следовательно, время жизни объекта также легко отследить.
Третий шаг - деликатный, введение совместного владения.Это действительно усложняет все рассуждения о времени жизни объекта и создает риск циклов ссылок, которые фактически означают утечки памяти.Они требуются в некоторых ситуациях, но лучше избегать их, когда это возможно.
std::shared_ptr
(C ++ 0x) или эквивалентный (std::tr1::shared_ptr
, boost::shared_ptr
) std::weak_ptr
(C ++ 0x) или эквивалентный
Последний используется для "разрыва" циклов.Однако может быстро стать трудно понять, где ввести weak_ptr
, даже с графиком отношений.
РЕДАКТИРОВАТЬ:
Как отметил Тобиас, этоидиома известна как инициализация ресурсов (RAII), название которой неловко.Появляется новый термин: Scoped Bound Resources Management (SBRM), чтобы описать его подмножество -> связывание ресурсов с областью действия.