Когда мы выпустим объекты в кодах, используя Connector / c ++? - PullRequest
0 голосов
/ 26 декабря 2011

Я нашел пример на этой ссылке

Я знал, что C ++ не поддерживает блок finally, поэтому, если какое-либо исключение выдается при получении данных (например, в while block), затем объекты Connection, Statement и Result не могут быть освобождены.

Итак, мне интересно, как (или когда) эти объекты были освобождены ... Или есть другой способнаписание кода для их освобождения?

P / S: Я провел много времени на других языках, таких как Java, C #, поэтому, возможно, моя мысль ошибается в чем-то.Поправь меня, если что не так.

1 Ответ

3 голосов
/ 26 декабря 2011

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

...