Прежде чем идти по пути отладки, давайте рассмотрим проект.
Существует два основных правила, позволяющих избежать утечек памяти:
- не использовать
new
- не использовать
delete
Поначалу это может показаться удивительным:)
1. Не используйте new
Вы не должны выделять кучу всякий раз, когда вы действительно можете избежать ее:
- выделить в стеке
- используйте контейнеры, которые будут обрабатывать выделение памяти для вас
Каждый new
, который вы удаляете из своего кода, обязательно является утечкой памяти, которой у вас не будет.
2. Не используйте delete
Проблема в том, что сопоставить каждый new
с delete
чрезвычайно сложно. Трудно запомнить, чтобы удалить его, трудно не удалить его дважды.
C ++ предлагает удобное решение в форме SBRM (Scoped-Bound Resources Management, также известное по аббревиатуре RAII, название которой довольно обманчиво). Это, в частности, означает умных менеджеров .
Всякий раз, когда вы действительно вызываете new
, обязательно передайте ответственность за управление вновь выделенным объектом либо умному указателю, либо некоторому другому столь же умному контейнеру (например, boost::ptr_vector
).
3. Код отзыва
- Вопрос каждого использования
new
- Убедитесь, что каждый
new
результат немедленно помещается в смарт-менеджер
Примечание: единственное место для delete
- это когда ВЫ пишете умный менеджер. Обычно нет особого смысла, учитывая широкий выбор. Однако, если вы это сделаете, помните, что это область гуру (исключение безопасности, ...); Единственный совет, который я могу дать, это то, что умный менеджер делает только одно: он умело управляет ЕДИНСТВЕННЫМ ресурсом. Попробуйте объединить это с чем-то другим, и у вас не получится, и вы даже не поймете это