gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:01:07 24 4
gpt4 key购买 nike

我在 this link 上找到了一个例子

我知道 C++ 不支持 finally block ,所以如果在检索数据期间抛出任何异常(例如:在 while block 中),然后 ConnectionStatementResult 对象不能被释放。

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

P/S:我在Java、C#等其他语言上花了很多时间,所以我的想法可能有问题。如有不妥请指正。

最佳答案

C++ 没有 finally block ,因为它不需要它们。它有更好的东西:析构函数。

类类型对象可以有一个析构函数,当该类类型对象的实例不复存在时,将调用该析构函数。具有所谓的“自动存储持续时间”的局部变量在声明它们的 block 的末尾不再存在。

因此应该使用析构函数来管理资源。与其在 block 末尾编写 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++ 中理解和一致使用的最重要的习语。自己很难正确管理资源;当您让 } 为您完成所有艰苦的工作时,一切都会变得容易得多。

关于c++ - 我们什么时候使用 Connector/c++ 释放代码中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8632957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com