2011-12-26 48 views
0

我发现this link我们什么时候可以使用Connector/C++发布代码中的对象?

我知道C++不支持finally块的例子,因此,如果检索数据(例如:在块)期间抛出的任何异常,那么ConnectionStatementResult对象不能释放。

所以,我不知道这些对象是如何(或何时)发布的......或者有另一种方法来编写代码来释放它们? P/S:我花了很多时间在诸如Java,C#等其他语言中,因此也许我的思想在某些方面出了问题。如果有什么不对,请纠正我。

+1

哇,链接上的示例代码是错误的,关于异常处理。它应该被禁止。 – Frunsi 2011-12-26 04:50:42

回答

3

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)。

请注意,此处连接对象的生命周期是自动管理的:您不必记住d销毁对象,如果抛出异常,则不必担心执行特殊清理。析构函数将确保连接对象被销毁。

这种使用析构函数来执行资源清理的技术叫做资源获取初始化(RAII),它是理解和在C++中一贯使用的最重要的习惯用法。你自己很难正确地管理资源;当你让}为你做所有的辛苦工作时,这是一件容易的事情。

+0

+1,并请添加关于RAII的注意事项;-) – Frunsi 2011-12-26 04:51:33

相关问题