BigApple.ru » Программы » C++ » Уничтожение с разделением фаз

Уничтожение с разделением фаз

Добавлено: 22.02.2012
Автор: AlexKurochkin

Объект, переданный в качестве аргумента оператору delete, обычно уничтожается компилятором вдва этапа:

1.    Вызов деструктора.

2.    Вызов оператора delete для освобождения памяти.

Довольно часто мы качаем головой и говорим: «Хорошо бы вызвать деструктор, но не трогать память».Допустим, вы разместили объект в пуле, а теперь не хотите, чтобы часть локально созданного пула

вернулась в главное хранилище памяти. По аналогии с тем, как мы разделили двухшаговый процессконструирования, можно разделить и двухшаговый процесс уничтожения, напрямую вызываядеструкторы. Однако в отличие от тех выкрутасов, которыми сопровождалось разделение процессаконструирования, с уничтожением дело обстоит очень просто — достаточно вызвать деструктор так,словно это обычная функция класса.

void f()

{

Pool localPool;

Foo* foo1 = new Foo; // Использует оператор new по умолчаниюFoo* foo2 = new(&localPool) Foo; // Использует перегрузкуdelete foo1; // Для оператора new по умолчаниюfoo2->~Foo(); // Прямой вызов деструктора

}

localPool — большой блок памяти, локальный по отношению к функции. Поскольку он создается встеке, при завершении f() он выталкивается из стека. Выделение происходит молниеносно, посколькулокальные объекты заполняют пул снизу вверх. Освобождение происходит еще быстрее, посколькууничтожается сразу весь пул. Единственная проблема заключается в том, что компилятор не будетавтоматически вызывать деструкторы объектов, созданных внутри localPool. Вам придется сделатьэто самостоятельно, используя только что описанную методику.

0 комментариев
Оцените статью:
Участник обсуждения

Нажмите, чтобы ответить

     
Время формирования страницы на сервере: 0.436 сек.