Автоматические указатели

Предположим, возникла необходимость в некоторой функции выделить область памяти для временного использования. При выходе из функции память нужно освободить – иначе она начнет потихоньку расходоваться и в конце-концов просто может закончится. Если точка выхода одна, то проблем нет – перед выходом вызываем 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);

….

}

оператор освобождения памяти вызовется автоматически при выходе из функции из деструтора класса-оболочки.



Digital Ocean
Провайдер облачного хостинга - заведи свой виртуальный сервер всего за $5 в месяц !

One Comment

  1. Евгений

    еще лучше переопределить конструктор копирования, присваивания, добавить статический счетчик, или при копировании хранить указатель на счетчик и сделать shared_ptr

Leave a Reply