#cpp
Допустим в ф-ции я создаю allocator, он распределяет память, потому деалацирует её, но представим что я забыл деалацировать какой-то отдельный кусок памяти, дак вот вопрос: Когда allocator выходит из области видимости ф-ции, т.е. вызывается его деструктор, подчищает ли он ту память которую я забыл деалацировать? И в чём разница между ф-циями deallocate() и destroy(), ведь результат один и тот же, память освобождается. Зачем вызывать destroy() уничтожать объект, если можно просто освободить память?
Ответы
Ответ 1
std::allocator является аллокатором без состояния (stateless), а это значит, что его деструктор ничего не делает — он пустой. Всё, что выделено с помощью allocate(), должно быть освобождено с помощью deallocate(), в противном случае будет утечка памяти. deallocate() и destroy() являются совершенно разными функциями: первая освобождает память, а вторая уничтожает объект. Вот как может выглядеть реализация функции deallocate: templatevoid 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 освобождает только память под объекты, не вызывая деструкторы, это большая разница.
Комментариев нет:
Отправить комментарий