Изучите идиому RAII ( Получение ресурсов - инициализация )! Смотрите, например статья Википедии о RAII .
RAII - это просто общая идея. Он используется, например, в стандартных библиотеках C ++ std::unique_ptr
или std::shared_ptr
шаблонных классов.
Очень краткое объяснение идиомы RAII:
По сути, это C ++ версия блоков try..finally
, найденная в некоторых других языках. Идиома RAII, возможно, более гибкая.
Работает так:
Вы пишете класс-оболочку для своего ресурса (например, памяти). Деструктор отвечает за освобождение ресурса.
Вы создаете в качестве локальной (автоматической) переменной экземпляр вашего класса-оболочки в области видимости. Как только выполнение программы выходит из этой области, вызывается деструктор объекта, освобождая тем самым ресурс (например, память).
Важным моментом является , что не имеет значения как выходит из области видимости. Даже если выдается исключение, область действия все еще закрывается, а деструктор объекта-оболочки по-прежнему вызывается.
Очень грубый пример:
// BEWARE: this is NOT a good implementation at all, but is supposed to
// give you a general idea of how RAII is supposed to work:
template <typename T>
class wrapper_around
{
public:
wrapper_around(T value)
: _value(value)
{ }
T operator *()
{
return _value;
}
virtual ~wrapper_around()
{
delete _value; // <-- NOTE: this is incorrect in this particular case;
// if T is an array type, delete[] ought to be used
}
private:
T _value;
};
// ...
{
wrapper_around<char*> heap( new char[50] );
// ... do something ...
// no matter how the { } scope in which heap is defined is exited,
// if heap has a destructor, it will get called when the scope is left.
// Therefore, delegate the responsibility of managing your allocated
// memory to the `wrapper_around` template class.
// there are already existing implementations that are much better
// than the above, e.g. `std::unique_ptr` and `std::shared_ptr`!
}