#cpp
This question already has an answer here: Удаление нулевого указателя (1 ответ) Закрыт 1 год назад. Почему мне подсвечиваются подсказки для массивов где я делаю проверку на nullptr перед вызовом delete[], получаю подсказку о том что вызов delete[] для nullptr не производит никаких эффектов? Это правда, или это лишь поддержка с какого-то стандарта, или подсказка о том что я в коде нигде не заполняю массив, и его можно спокойно удалять даже с значением nullptr?
Ответы
Ответ 1
Стандарт утверждает, что оператору delete (delete[]) можно смело передавать nullptr - просто в этом случае оператор не будет делать ничего (см. п. 5.3.5.2 стандарта). ...значение операнда delete может представлять собой нулевое указательное значение, либо указатель на объект-немассив, созданный посредством некоторого предыдущего new-выражения, либо быть указателем на подобъект (1.8) базового класса объекта-немассива (глава 10). В противном случае поведение программы не определено. Примерно то же говорится и для оператора delete[]: ...значение операнда операции delete может быть нулевым указательным значением, либо указателем, полученным в результате некоторой предыдущей операции new-выражение для массива.Ответ 2
Ну, во-первых, операторы delete/delete [] в принципе невозможно вызвать ни с каким nullptr. nullptr имеет тип std::nullptr_t и использовать значение этого типа в качестве операнда этих операторов не получится. Операндом delete/delete [] должен являться либо указатель на объектный тип, либо класс, приводимый к такому указателю. Если указатель является null-указателем, то delete/delete [] просто ничего не делает. Null-указатель и nullptr - это совершенно разные вещи. Во-вторых, испокон веков в С и С++ (и далеко за их пределами) было принято придерживаться негласного соглашения о том, что средства освобождения ресурсов ничего не делают в ответ на нулевой хендл ресурса. Точно так же, как функция free() ничего не делает в ответ на null-указатель, операторы delete/delete[] ничего не делают в ответ на null-указатель. Этого негласного правила придерживаются во многих API. (fclose с этой точки зрения является неприятным исключением).
Комментариев нет:
Отправить комментарий