Когда мы выпустим объекты в кодах, используя Connector/ C++?
Я нашел пример по этой ссылке
Я знал, что C++ не поддерживает finally
блок, поэтому, если какое-либо исключение выдается во время извлечения данных (например, в блоке while), то Connection
, Statement
, а также Result
объекты не могут быть освобождены.
Итак, мне интересно, как (или когда) эти объекты выпущены... Или есть другой способ написания кода для их выпуска?
P / S: Я провел много времени на другом языке, таком как Java, C#, поэтому, возможно, моя мысль в чем-то ошибается. Поправь меня если что не так.
1 ответ
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
деструктор обеспечит уничтожение объекта подключения.
Этот метод использования деструкторов для выполнения очистки ресурсов называется Resource Acquisition Is Initialization (RAII) и является наиболее важной идиоматической для понимания и последовательного использования в C++. Трудно правильно управлять ресурсами самостоятельно; это намного проще, когда вы позволяете }
сделать всю тяжелую работу за вас.