【问题标题】:Using shared_ptr with sqlite3将 shared_ptr 与 sqlite3 一起使用
【发布时间】:2014-11-10 10:48:05
【问题描述】:

我正在尝试使用 shared_ptr 来保护 sqlite3 库在我的应用程序中引发的内存泄漏。

我需要将我的纯 c++ 代码转换为受保护的版本,而无需进行重大更改。我的代码的当前状态类似于:

sqlite3* db = NULL;
sqlite3_open(dbname.c_str(),   &db );
sqlite3_close( db );

我已经试过了:

std::shared_ptr<sqlite3> db(NULL);
sqlite3_close( db.get() );

但我无法翻译 open 函数,因为它正在请求我无法使用共享指针模拟的 sqlite3** 参数。 我已经找到 std::shared_ptr 连接(rawConnec,sqlite3_close); 但是这种功能没有官方文档或任何示例。

我被屏蔽了,非常感谢你

【问题讨论】:

  • “这种函数”是构造函数,is documented.
  • 对不起@CL。 ,我并不是说它没有记录在案。我找不到它。谢谢你的链接。无论如何,如果我不能将 shared_ptr 定义用作变量,我不明白我应该使用什么定义,因为我应该在“open”函数中将它作为双重引用传递。

标签: c++ sqlite shared-ptr


【解决方案1】:
std::shared_ptr<sqlite3> db(nullptr);
{
  sqlite3* dbPtr = NULL;
  sqlite3_open(dbname.c_str(),   &dbPtr );
  db.reset(dpPtr, sqlite3_close);
}

然后一旦db 和所有其他std::shared_ptrs 超出范围sqlite3_close 将在您的资源上调用。

不过,这有点小题大做,从长远来看,使用标准 RAII 类会更好,就像标准 C++ 实践一样。

【讨论】:

  • 谢谢@sjdowling,我已经测试了你的解决方法,它工作正常。但是,我无法消除应用程序中的所有内存泄漏,但我认为这可能取决于架构或代码的其他部分。非常感谢
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2018-05-13
相关资源
最近更新 更多