Прошу не ругать если я что-то не так объяснил, мне 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;
};
мне казалось что область памяти под список просто очиститься и перевыделиться
Объект, который создали с помощью new
, существует ровно до вызова на нем delete
. Сам он не удалится.
Вот если бы вы использовали вместо обычного указателя умный (std::unique_ptr
, ну или std::shared_ptr
), тогда ваш вариант бы сработал (в случае std::unique_ptr
- с небольшими изменениями). В этом случае умный указатель сам вызвал бы delete
, на то он и умный.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
что означает это строка кода *(*(p = new double*) = new double) = 2;
А нет ли в Windows ничего такого, похожего на сигналы в POSIX?