我们什么时候在使用Connector/c++的代码中释放对象?
When will we release objects in the codes using Connector/c++?
我在这个链接上找到了一个例子
我知道c++不支持finally
块,所以如果在检索数据期间抛出异常(例如:在而块中),则Connection
, Statement
和Result
对象无法释放。
所以,我想知道如何(或何时)这些对象释放…或者有另一种方式编写代码来发布它们?
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++中最重要的习惯用法,需要理解和一致地使用。你很难自己正确地管理资源;当你让}
为你做所有艰苦的工作时,这就容易多了。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 释放错误后堆使用
- 编译包含字符串的代码时遇到问题
- 代码中的"sprintf"用法是否需要释放内存?
- 如何在我的 c++ 代码中获取运行时的双重释放错误
- 带有QT的C 应用中的IIMEBRA代码给出malloc:***对象XXXXXX的错误:未分配释放的指针
- 释放构建仍然允许逐步通行代码,为什么
- OpenCV查找轮廓的示例代码:向量释放问题
- 下面的代码真的能在C/C++中释放内存吗
- 此代码将释放分配给MULTIMAP的内存吗
- 释放模式跳过部分代码
- 我们什么时候在使用Connector/c++的代码中释放对象?
- 内存分配/释放错误(非常小的代码)
- 如何编写析构函数才能编译代码并释放所有分配的内存
- 串口工作在调试,但不释放c++代码块窗口
- 在 ARM 处理器上运行 pcl::MovingMinimumSquares 代码时出现双释放或损坏运行时错误
- C ++链表不释放内存 - 寻找快速代码审查
- 在<int>代码块结束之前释放分配给 std::vector 的内存的正确方法