Станд. C++:: очередь:: поп () называет деструктор. Что из типов указателей?

У меня есть a std::queue это перенесено как шаблонный класс для создания ориентированной на многопотоковое исполнение очереди. У меня есть две версии этого класса: тот, который хранит типы значения, тот, который хранит типы указателей.

Для типа указателя я испытываю затруднения при удалении элементов очереди на разрушении. Причина состоит в том, что я не знаю способ удалить объекты из очереди безопасно.

Эти ссылочные состояния (вырождено, таким образом, я предполагаю это, не делает на самом деле СОСТОЯНИЯ это), который состоит в том, чтобы назвать единственный способ удалить элементы из очереди pop(). Ссылка также говорит это pop() называет деструктор для объекта.

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

Так, когда pop() называет деструктор, что происходит? Как я удостоверяюсь, что все удаляется и освобождение памяти правильно?

Наконец, мое решение использует более старую версию GCC для ARM9. Я не управляю этим. Я понимаю, что существуют библиотеки, которые имеют интеллектуальные указатели и контейнеры, которые помогли бы здесь, но они запрещены для меня.

15
задан Sam 12 August 2014 в 09:05
поделиться

3 ответа

Онлайн-источники стоят того, что вы за них платите - получите правильную ссылку, как Книга Йосуттиса. pop() не "вызывает деструктор" - она просто удаляет элемент из базового представления адаптера очереди (по умолчанию std::deque), вызывая pop_front() на нем. Если вытаскиваемый элемент имеет деструктор, то он будет использован, когда вытаскиваемый объект выйдет из-под области видимости, но класс очереди к нему не имеет никакого отношения.

18
ответ дан 1 December 2019 в 00:10
поделиться

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

.
33
ответ дан 1 December 2019 в 00:10
поделиться

"Как обеспечить удаление всего и правильное распределение памяти?"

Если вам абсолютно необходимо хранить указатели в очереди, и вы хотите, чтобы они автоматически освобождались, когда они poped, то вместо очереди указателей вам нужна очередь объектов, которые хранят указатель, и удаляют его в своем деструкторе. Например, можно использовать очередь share_ptr. share_ptr не входит в стандартную библиотеку, но является частью TR1 и широко доступна.

В противном случае, ответственность за удаление объекта лежит на вызывающем абоненте:

T *off = q.front();
q.pop();
delete off;

Резюмируя, можно сказать, что контейнеры указателей на динамически выделяемые объекты немного неудобны. Если вы можете спроектировать свою программу так, что контейнеры будут хранить копии ваших объектов, а не указатели на динамически выделенные объекты, то сделайте это. В противном случае вы отвечаете за владение ресурсами, а не за контейнер. Контейнеры STL ничего не знают о собственности, они просто копируют и уничтожают их value_type . Копирование и уничтожение указателей ничего не делает с объектами, на которые они указывают.

4
ответ дан 1 December 2019 в 00:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: