C ++ не имеет блоков finally
, потому что они не нужны. В нем есть что-то намного лучше: деструкторы.
Объект типа класса может иметь деструктор, который будет вызываться для экземпляра объекта этого типа класса, когда экземпляр перестает существовать. Локальные переменные, имеющие так называемую «продолжительность автоматического хранения», перестают существовать в конце блока, в котором они объявлены.
Поэтому для управления ресурсами должны использоваться деструкторы. Вместо того чтобы писать выражение delete
в конце блока для уничтожения динамически размещаемого объекта, вы должны использовать умный указатель для управления временем жизни объекта. Например, рассмотрим следующие строки из примера программы, на которую вы ссылаетесь:
{
sql::Connection* con;
// ...
con = driver->connect("tcp://127.0.0.1:3306", "root", "root");
// ...
delete con;
}
Вместо этого это можно записать как:
{
// ...
std::unique_ptr<sql::Connection> con(
driver->connect("tcp://127.0.0.1:3306", "root", "root"));
// ...
} // con is automatically deleted here, even if an exception is thrown.
(Если вы используете более старый компилятор или реализацию стандартной библиотеки C ++, и у вас нет или вы не можете использовать std::unique_ptr
, вы можете использовать std::auto_ptr
для этого конкретного случая использования.)
Обратите внимание, что здесь время жизни объекта соединения управляется автоматически: вам не нужно помнить, чтобы уничтожить объект, и вам не нужно беспокоиться о выполнении специальной очистки при возникновении исключения. Деструктор std::unique_ptr
обеспечит уничтожение объекта подключения.
Этот метод использования деструкторов для очистки ресурсов называется Получение ресурсов является инициализацией (RAII) и является наиболее важной и понятной и понятной идиомой для C ++. Трудно правильно управлять ресурсами самостоятельно; намного проще, если вы позволите }
сделать всю тяжелую работу за вас.