Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Вызов delete[] для nullptr не приводит к падению приложения? [дубликат]

#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 с этой точки зрения является неприятным исключением).

Комментариев нет:

Отправить комментарий