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