Нужно ли инициализировать с помощью nullptr? - PullRequest
1 голос
/ 26 апреля 2020

На днях я дал C ++ интервью. Я должен был сделать проверку кода ...

Это не пример из интервью, но это хороший пример моего вопроса

class A{
    public:
    A(int n) : m_n{n}, m_v{new char[n]}{
    //do something
    }
    ~A(){
        if(m_v != nullptr)
        {
            //here I said it should be checked and initialized with nullptr
            delete []m_v;
            m_v = nullptr;
        }
    }
    private:
    int m_n;    
    char *m_v;

};

Интервьюер сказал, что это бесполезно. Ничего не произойдет, если вы удалите nullptr. Я ожидал, что это будет неопределенное поведение. Так что мой вопрос - это хорошая практика или нет? (или это обязательно)

1 Ответ

3 голосов
/ 26 апреля 2020

Оба, проверка для nullptr и назначения nullptr после delete не нужна и, следовательно, не должна быть в этом примере.

От cppreference on delete (выделите мое):

Для первой формы (не массива) выражение должно быть указателем на тип объекта или типом класса, контекстуально неявно преобразуемым в такой указатель и его значение должно быть либо нулевым , либо указателем на объект, не являющийся массивом, созданным новым выражением, либо указателем на базовый подобъект объекта, не являющегося массивом, созданным новым выражением.

[...]

Если выражение не является нулевым указателем и функция освобождения не является уничтожающим удалением (начиная с C ++ 20), выражение удаления вызывает деструктор (если есть) для уничтожаемого объекта или для каждого уничтожаемого элемента массива (начиная с последнего элемента до первого элемента массива).

Вызов delete на nullptr ничего не делает.

Назначение nullptr после delete в вашем примере бессмысленно, если в деструкторе нет другого кода, который проверяет m_v на наличие nullptr или нет. После запуска деструктора m_v больше не существует.

PS: Это действительно не стиль. Код, который не имеет возможности сделать что-то полезное, не должен быть написан. На самом деле без обид, но выполнение проверки для nullptr и установка указателя на nullptr можно рассматривать как car go культовое программирование .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...