Предположим, возникла необходимость в некоторой функции выделить область памяти для временного использования. При выходе из функции память нужно освободить - иначе она начнет потихоньку расходоваться и в конце-концов просто может закончится. Если точка выхода одна, то проблем нет - перед выходом вызываем delete и вопрос решен. А если их несколько? Конечно, можно перед каждым return память освобождать, но выглядеть это будет некрасиво, да и следить за наличием освобождающего кода придется программисту, что может повлечь за собой дополнительные ошибки.
На самом деле, эта задача решается достаточно легко, с помощью класса-оболочки для указателя(auto_ptr).
STL содержит этот класс, но для понимания вопроса мы его напишем сами, так сказать с нуля, благо он достаточно прост.
Воспользуемся тем свойством что автоматические переменные уничтожаются при выходе из блока, в котором они обьявлены. При уничтожении обьекта класса вызывается его деструктор.
template<class T> class my_auto_ptr {
private:
T* data;
public:
my_auto_ptr(T* object) { data = object; }
~my_auto_ptr() { if(data) delete data; }
}
это весь код, большек ничего не надо.
Использовать его нужно таким образом:
void theTest(void) {
someClass *sc = new someClass();
my_auto_ptr scc(sc);
….
}
оператор освобождения памяти вызовется автоматически при выходе из функции из деструтора класса-оболочки.
Copyright 2008 - ТолиБлог
Powered by WordPress - Web hosting Services by Wordpress Theme, Archived by WPT
1 Комментарий
Евгений
24|Apr|2006 1еще лучше переопределить конструктор копирования, присваивания, добавить статический счетчик, или при копировании хранить указатель на счетчик и сделать shared_ptr
Оставьте отзыв