Подтвердить что ты не робот

С++ std:: queue:: pop() вызывает деструктор. Что из типов указателей?

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

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

В этом справочном состоянии (без видимых причин, так что я не думаю, что это НЕ ГОСУДАРСТВО), что единственный способ удалить элементы из очереди для вызова pop(). В ссылке также указано, что pop() вызывает деструктор для элемента.

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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