Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Как работает деструктор std::allocator

#cpp


Допустим в ф-ции я создаю allocator, он распределяет память, потому деалацирует её,
но представим что я забыл деалацировать какой-то отдельный кусок памяти, дак вот вопрос:
Когда allocator выходит из области видимости ф-ции, т.е. вызывается его деструктор,
подчищает ли он ту память которую я забыл деалацировать?  

И в чём разница между ф-циями deallocate() и destroy(), ведь результат один и тот
же, память освобождается. Зачем вызывать destroy() уничтожать объект, если можно просто
освободить память?
    


Ответы

Ответ 1



std::allocator является аллокатором без состояния (stateless), а это значит, что его деструктор ничего не делает — он пустой. Всё, что выделено с помощью allocate(), должно быть освобождено с помощью deallocate(), в противном случае будет утечка памяти. deallocate() и destroy() являются совершенно разными функциями: первая освобождает память, а вторая уничтожает объект. Вот как может выглядеть реализация функции deallocate: template void std::allocator::deallocate(T* ptr) { ::operator delete(ptr); } А вот пример destroy: template template void std::allocator::destroy(U* ptr) { ptr->~T(); } Как говорится: найди 10 отличий. Зачем уничтожать объект? Пусть у нас есть такой класс: class SimpleMe { public: SimpleMe() { m_Resource = new int[100]; } ~SimpleMe() { delete m_Resource; } private: int* m_Resource; }; Как думаете, если мы выделим память под этот объект, сконструируем его (construct()), а затем просто вызовем deallocate(), что тогда будет? На каждый allocate должен быть вызван deallocate, на каждый construct должен быть вызван destroy.

Ответ 2



destroy вызывает деструктор объекта, а у объекта может быть очень много связей и информации. А память под этот объект ещё не освобождается. Полезно когда область видимости аллокатора ещё очень далеко, а объект сам по себе уже не нужен. Можно потом создать объект ещё раз под эту память с помощью construct. deallocate освобождает только память под объекты, не вызывая деструкторы, это большая разница.

Комментариев нет:

Отправить комментарий