Ответ 1
Предостережение. Я согласен с этим ответом, так как я думаю, что это лучшая практика, которая улучшит ~ 95% кода на С++ - возможно, даже больше. Тем не менее, пожалуйста, прочитайте полные комментарии для обсуждения некоторых важных оговорок.
Поскольку это был мой комментарий, heres моя презентация, объясняющая это.
В двух словах:
[Raw] указатели должен. не. своя. ресурсы.
Своя ошибка и ненужная, потому что у нас есть лучшие способы управления ресурсами, которые приводят к меньшему количеству ошибок, короче, более читабельному коду и большей уверенности в правильности кода. Экономически: они стоят меньше.
Чтобы быть более конкретным в отношении комментария, который я сделал:
Начиная с С++ 11 (теперь в течение двух лет и реализуется в соответствующих частях всеми современными компиляторами), ручное удаление памяти совершенно не нужно (если вы не пишете очень низкоуровневый код обработки памяти), потому что вы всегда можете использовать интеллектуальные указатели и обычно даже им не нужны (см. презентацию). Тем не менее, С++ 11 по-прежнему требует использования new
при создании нового std::unique_ptr
. В С++ 14 функция std::make_unique
делает это использование new
ненужным. Следовательно, он больше не нужен.
По-прежнему возможно место для размещения < <20 > в коде, но это (а) совершенно другой случай из обычного new
, хотя синтаксис подобен, и (b) можно заменить в большинстве с помощью функции allocator::construct
.
Джеймс указал на исключение из этого правила, о котором я честно забыл: когда объект управляет своей собственной жизнью. Я выхожу на конечность и говорю, что это не обычная идиома в большинстве сценариев, потому что время жизни объекта всегда может управляться извне. Однако в некоторых приложениях может быть полезно отделить объект от остальной части кода и позволить ему управлять собой. В этом случае вам необходимо динамически распределить объект и освободить его с помощью
delete this
.