Удаление последнего элемента в списке

104
05 мая 2021, 10:10

Прошу не ругать если я что-то не так объяснил, мне 15 лет. Я увлекаюсь программированием на языке С++. В настоящее время я решил немного подтянуть свои знание в структурировании данных. Я часто сталкивался с проблемой каталогизации большого количества однотипных данных, я не люблю подключать инструменты со сторонних библиотек по типу STL, я считаю что использование сторонних библиотек только мешает в процессе обучения.

Я решил написать свой класс для структурирования однотипных данных, я вдохновился "list<>" классом из STL. Я посмотрел некоторые исходники и мне стало интересно почему момент удаления последнего элемента из списка реализован таким образом:

template< typename T >
bool list< T >::remove() {
    if (m_head) {
        Node* n_head = m_head->m_next;
        delete m_head;
        m_head = n_head;
    }
}

Я поверхностно понимаю устройство памяти и работу с ней на данном языке, но не могу понять почему в этом примере используется оператор delete[].

Разве это не правильней реализовать немного другим способом? Например так:

template< typename T >
bool list< T >::remove() {
    if (m_head) {
        m_head = m_head->m_next;
    }
}

Сначала мне казалось что область памяти под список просто очиститься и перевыделиться под новую структуру. Я не совсем в этом уверен и не очень понимаю как это правильно отследить. Прошу помочь мне с этим моментом. Прошу не писать что я маленький дурак в ответах, это и так понятно :)

Структура "Node":

struct Node {
    Node() : m_next(NULL) { }
    Node(const T& value) : m_value(value), m_next(NULL) { }
    T m_value;
    Node* m_next;
};
Answer 1

мне казалось что область памяти под список просто очиститься и перевыделиться

Объект, который создали с помощью new, существует ровно до вызова на нем delete. Сам он не удалится.

Вот если бы вы использовали вместо обычного указателя умный (std::unique_ptr, ну или std::shared_ptr), тогда ваш вариант бы сработал (в случае std::unique_ptr - с небольшими изменениями). В этом случае умный указатель сам вызвал бы delete, на то он и умный.

READ ALSO
Как получить кол-во элементов массива

Как получить кол-во элементов массива

Допустим, есть матрица

72
что означает это строка кода *(*(p = new double*) = new double) = 2;

что означает это строка кода *(*(p = new double*) = new double) = 2;

что означает это строка кода *(*(p = new double*) = new double) = 2;

95
Есть ли в Windows сигналы похожие на те что в POSIX?

Есть ли в Windows сигналы похожие на те что в POSIX?

А нет ли в Windows ничего такого, похожего на сигналы в POSIX?

66