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

224
03 мая 2018, 09:05

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

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

Answer 1

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.

Answer 2

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

READ ALSO
Нужна помощь в задании по С++

Нужна помощь в задании по С++

Нужно написать программу для шифрования и дешифрования файла за указанным именему меня не получается зашифровать файл поскольку прогамма...

264
Как сохранить toggle class, цвет элемента li

Как сохранить toggle class, цвет элемента li

Есть список ul li, который хранит в себе данные вписанные пользователем в формыДанные добавляются в li и в localStorage объект(данные не пропадают...

287
Фоновое видео YouTube на сайте

Фоновое видео YouTube на сайте

Сделал на сайте фоновое видео с YouTube, используя плагин jquerymb

245