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

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

….

}

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

Посты по теме:

  • Пока что ничего не написано


Сервис Zadarma.com
Недорогие международные звонки, высокое качество речи. Протокол SIP.
Пополнение через Webmoney, терминалы оплаты

One Comment

  1. Евгений

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

Leave a Reply