Я читал о умных указателях C++ 11, чтобы использовать их в своих источниках, документация, которую я читал, является той, что на cppreference.com; читая о std::unique_ptr
, на reset
function есть документация, которая кажется неправильным мне (курсив мой):std :: unique_ptr :: reset проверяет недействительность управляемого указателя?
Заменяет управляемый объект.
Учитывая
current_ptr
указатель, который управляет*this
, выполняет следующие действия в указанном порядке:
- Сохраняет копию текущего указателя
old_ptr = current_ptr
.- Заменяет текущий указатель аргументом
current_ptr = ptr
.- Если старый указатель не был пустым, удаляет ранее управляемый объект
if(old_ptr != nullptr) get_deleter()(old_ptr)
.
В стандартной документации C++, мы можем прочитать известную удалить нулевую функцию указателя:
Выписка из n3690
стандарта 5.3.5 Удаление (курсив мой):
Если значение операнда delete-expression не является нулевым значением указателя, то:
- Если вызов выделения для нового выражения для объекта, подлежащего удалению, не был пропущен, delete-expression должен вызвать функцию освобождения. Значение, возвращаемое из вызова выделения нового выражения, передается как первый аргумент функции освобождения.
- В противном случае удаления выражение не будет вызывать функцию Deallocation.
Итак, я задаюсь вопрос, почему cppreference говорит, что unique_ptr::reset
функция проверяет ничтожность управляемого указателя, прежде чем это удаление даже в то время как тот стандарт говорит, что ни одна функция открепления не будет называться по нулевому указателю (именно поэтому Документация cppreference кажется мне неправильной).
Является очевидным, что я должен ошибаться, и, должно быть, есть причина делать это таким образом, но я не могу представить, какая причина это может быть. Любые намеки?
PS: Где в стандарте определено, как должно осуществляться или вести себя как std::unique_ptr
? В 20.9.1 Шаблон класса unique_ptr
Я ничего не могу найти о check-for-nullity.
'delete' - это не единственное, что сделано для того, чтобы избавиться от указательного ресурса. У вас может быть пользовательский deleter, который 'free' или другие вещи, которые не любят нулевые указатели. – Xeo