Я предпочитаю эту версию:
~scoped_ptr() {
delete this->ptr_; //this-> for emphasis, ptr_ is owned by this
}
Установка нулевого указателя после его удаления совершенно бессмысленна, поскольку единственная причина, по которой вы будете использовать указатели, состоит в том, чтобы позволить объекту ссылаться в нескольких местах одновременно. Даже если указатель в одной части программы равен 0, вполне могут быть и другие, для которых не установлено значение 0.
Кроме того, шаблон макроса / функции safe_delete очень трудно использовать правильно, потому что есть только два места, которые он может использовать, если есть код, который может бросить между новым и удаленным для данного указателя.
1) Внутри блока catch (...), который перебрасывает исключение, а также дублируется рядом с блоком catch (...) для пути, который не выбрасывает. (Также дублируется рядом с каждым разрывом, возвратом, продолжением и т. Д., Что может позволить указателю выпасть из области видимости)
2) Внутри деструктора для объекта, которому принадлежит указатель (если нет кода между new и delete, который может генерировать).
Даже если нет кода, который мог бы выдать, когда вы пишете код, это может измениться в будущем (все, что нужно, это чтобы кто-то пришел и добавил еще один новый после первого). Лучше писать код так, чтобы он оставался верным даже при исключениях.
Вариант 1 создает так много дублирования кода и так легко ошибиться, что я даже сомневаюсь назвать его опцией.
Опция 2 делает safe_delete избыточным, поскольку значение ptr_, которое вы устанавливаете в 0, выйдет из области видимости на следующей строке.
В итоге - не используйте safe_delete, так как он вообще не безопасен (его очень сложно правильно использовать и приводит к избыточному коду, даже когда его использование корректно). Используйте SBRM и умные указатели.