Допустим в ф-ции я создаю 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 освобождает только память под объекты, не вызывая деструкторы, это большая разница.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Нужно написать программу для шифрования и дешифрования файла за указанным именему меня не получается зашифровать файл поскольку прогамма...
Есть список ul li, который хранит в себе данные вписанные пользователем в формыДанные добавляются в li и в localStorage объект(данные не пропадают...
Сделал на сайте фоновое видео с YouTube, используя плагин jquerymb