我们什么时候在使用Connector/c++的代码中释放对象?

When will we release objects in the codes using Connector/c++?

本文关键字:代码 释放 对象 c++ 什么时候 Connector 我们      更新时间:2023-10-16

我在这个链接上找到了一个例子

我知道c++不支持finally块,所以如果在检索数据期间抛出异常(例如:在块中),则Connection, StatementResult对象无法释放。

所以,我想知道如何(或何时)这些对象释放…或者有另一种方式编写代码来发布它们?

p/S:我花了很多时间在其他语言上,比如Java、c#,所以可能我的想法在某些地方出错了。

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++中最重要的习惯用法,需要理解和一致地使用。你很难自己正确地管理资源;当你让}为你做所有艰苦的工作时,这就容易多了。