Когда мы выпустим объекты в кодах, используя 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++. Трудно правильно управлять ресурсами самостоятельно; это намного проще, когда вы позволяете } сделать всю тяжелую работу за вас.

Другие вопросы по тегам