Подтвердить что ты не робот

С++ (14) и ручное управление памятью

Я только что получил комментарий, например

Проблема заключается в управлении ручной памятью. delete не имеет места в коде пользователя, а с С++ 14 и не имеет new

Может кто-нибудь объяснить мне почему?

4b9b3361

Ответ 1

Предостережение. Я согласен с этим ответом, так как я думаю, что это лучшая практика, которая улучшит ~ 95% кода на С++ - возможно, даже больше. Тем не менее, пожалуйста, прочитайте полные комментарии для обсуждения некоторых важных оговорок.

Поскольку это был мой комментарий, heres моя презентация, объясняющая это.

В двух словах:

[Raw] указатели должен. не. своя. ресурсы.

Своя ошибка и ненужная, потому что у нас есть лучшие способы управления ресурсами, которые приводят к меньшему количеству ошибок, короче, более читабельному коду и большей уверенности в правильности кода. Экономически: они стоят меньше.

Чтобы быть более конкретным в отношении комментария, который я сделал:

Начиная с С++ 11 (теперь в течение двух лет и реализуется в соответствующих частях всеми современными компиляторами), ручное удаление памяти совершенно не нужно (если вы не пишете очень низкоуровневый код обработки памяти), потому что вы всегда можете использовать интеллектуальные указатели и обычно даже им не нужны (см. презентацию). Тем не менее, С++ 11 по-прежнему требует использования new при создании нового std::unique_ptr. В С++ 14 функция std::make_unique делает это использование new ненужным. Следовательно, он больше не нужен.

По-прежнему возможно место для размещения < <20 > в коде, но это (а) совершенно другой случай из обычного new, хотя синтаксис подобен, и (b) можно заменить в большинстве с помощью функции allocator::construct.


Джеймс указал на исключение из этого правила, о котором я честно забыл: когда объект управляет своей собственной жизнью. Я выхожу на конечность и говорю, что это не обычная идиома в большинстве сценариев, потому что время жизни объекта всегда может управляться извне. Однако в некоторых приложениях может быть полезно отделить объект от остальной части кода и позволить ему управлять собой. В этом случае вам необходимо динамически распределить объект и освободить его с помощью delete this.

Ответ 2

Smart pointers и, в свою очередь, следует использовать std::make_shared и std::make_unique, потому что обращение с new/delete и т.д. более подвержено ошибкам, когда приложения генерируют исключения и т.д.

Умные указатели автоматически удаляются (используя RAII) при использовании даже тогда, когда исключения генерируются в отличие от нового/удаления, которое может утечка памяти

См. this и this для получения дополнительной информации

Ответ 3

Единственное, что говорится в цитируемом заявлении, это то, что человек который сказал, что он действительно не понимает дизайн программы или способ С++ работает (и способ использования динамической памяти в С++). оператор определяет анти-шаблон, более чем что-либо еще.

Существуют определенные типы приложений, где это может быть применимо; приложение, над которым я работаю в настоящее время, является одним. Но он не общий, и в большинстве приложений, над которыми я работал в прошлом большинство удалений находилось в коде пользователя. (Те которые не были в базовых классах, таких как std::vector.)