Допустим в ф-ции я создаю allocator, он распределяет память, потому деалацирует её, но представим что я забыл деалацировать какой-то отдельный кусок памяти, дак вот вопрос:
Когда allocator выходит из области видимости ф-ции, т.е. вызывается его деструктор, подчищает ли он ту память которую я забыл деалацировать?
И в чём разница между ф-циями deallocate() и destroy(), ведь результат один и тот же, память освобождается. Зачем вызывать destroy() уничтожать объект, если можно просто освободить память?
std::allocator является аллокатором без состояния (stateless), а это значит, что его деструктор ничего не делает — он пустой. Всё, что выделено с помощью allocate(), должно быть освобождено с помощью deallocate(), в противном случае будет утечка памяти.
deallocate() и destroy() являются совершенно разными функциями: первая освобождает память, а вторая уничтожает объект.
Вот как может выглядеть реализация функции deallocate:
template<typename T>
void std::allocator<T>::deallocate(T* ptr)
{
::operator delete(ptr);
}
А вот пример destroy:
template<typename T>
template<typename U>
void std::allocator<T>::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.
destroy вызывает деструктор объекта, а у объекта может быть очень много связей и информации. А память под этот объект ещё не освобождается. Полезно когда область видимости аллокатора ещё очень далеко, а объект сам по себе уже не нужен. Можно потом создать объект ещё раз под эту память с помощью construct. deallocate освобождает только память под объекты, не вызывая деструкторы, это большая разница.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей