Вы используете шаблон RAII, когда вам нужно выполнить явную очистку, и хотите, чтобы эта очистка происходила одновременно с неявной очисткой другого объекта. Это может происходить для выделения / освобождения памяти, входа / выхода критической секции, соединений с базой данных и т. Д. В вашем примере «поплавки» очищаются автоматически, поэтому вам не нужно беспокоиться о них. Однако, скажем, у вас была следующая функция, которую вы вызывали для получения векторов:
Vector* getMeAVector() {
Vector *v = new Vector();
// do something
return v;
}
И, скажем, вызывающая сторона несет ответственность за удаление возвращенного вектора. Если вы назвали этот код следующим образом:
Vector *v = getMeAVector();
// do some stuff with v
delete v;
Вы должны помнить, чтобы освободить вектор. Если «материал» - это длинный фрагмент кода, который может выдать исключение или содержать несколько операторов return, вам придется освобождать вектор с каждой точкой выхода. Даже если вы это сделаете, тот, кто поддерживает код, добавив еще один оператор «return» или вызвав какую-то библиотеку, которая выдает исключение, может этого не делать. Вместо этого вы можете написать такой класс:
class AutoVector
{
Vector *v_;
public:
AutoVector(Vector *v) : v_(v) {}
~AutoVector() { delete v_; }
};
Тогда вы можете получить вектор следующим образом:
Vector *v = getMeAVector();
AutoVector av(v);
// do lots of complicated stuff including throwing exceptions, multiple returns, etc.
Тогда вам больше не нужно беспокоиться об удалении вектора, потому что когда av выходит из области видимости, он будет удален автоматически. Вы можете написать небольшой макрос, чтобы сделать синтаксис "AutoVector av (v)" также немного лучше, если хотите.
Это немного надуманный пример, но если окружающий код сложен, или если он может генерировать исключения, или кто-то приходит и добавляет оператор "return" в середине, хорошо, что "AutoVector" будет освободить память автоматически.
Вы можете сделать то же самое с классом "auto", который входит в критическую секцию своего ctor и выходит из его dtor и т. Д.