Страницы

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

понедельник, 1 апреля 2019 г.

Нужно ли при удалении проверять, была ли выделена память?

Есть указатель на объект, и он указывает на выделенную память через new. Можно спокойно вызывать для него delete? А если он не указывает на созданный в динамической памяти объект, то delete ошибку выполнения не вызовет? Как проверить, что объект указывает на выделенный участок который можно удалить? Просто если if(object != null) или (object) и потом аж вызывать delete? Или delete и сам может определить, есть ли что-то для удаления или нет?


Ответ

Если указатель указывает на объект, выделенный при помощи new, и для него ещё ни разу не был вызван delete, то вызывать delete можно. Также можно вызывать delete по нулевому указателю (сколько угодно раз). В любом другом случае — нельзя. Ответственность за соблюдение этого условия лежит на программисте, ни компилятор, ни runtime-библиотека за вас этого не проверят. Хуже того, несоблюдение этого условия есть undefined behaviour: программа считается необратимо сломанной, и может вылететь, а может (что гораздо хуже) не вылететь, а работать как будто бы всё в порядке. Обычно помогает простой принцип: если вы сами выделили объект, вам его и удалять. Если к вам он пришёл со стороны, как правило ответственность за удаление лежит на том, кто его создавал. Но возможны и исключения, когда вместе с объектом вам передаётся и обязанность его удалить. Смотрите документацию функций, которые вы вызываете. С другой стороны, в современном C++ работа с «сырыми» указателями происходит довольно редко. Обычно между частями программы передаётся «умный» указатель (например, shared_ptr), при этом проблема снимается, поскольку объект по указателю автоматически удаляется, когда нужно.

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

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