首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAII和赋值

RAII和赋值
EN

Stack Overflow用户
提问于 2010-07-18 09:13:56
回答 3查看 636关注 0票数 3

我为sqlite3连接创建了以下类:

代码语言:javascript
复制
class SqliteConnection
{
public:
    sqlite3* native;

    SqliteConnection (std::string path){
        sqlite3_open_v2 (path.c_str(), &native, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
    }

    ~SqliteConnection (){
        sqlite3_close(native);
    }
}

然后,可以按如下方式初始化连接

代码语言:javascript
复制
SqliteConnection conn("./database.db");

但是,我希望能够共享此连接,将其存储为类中的成员,等等,问题出在缺省赋值操作符operator=。做像这样的事情

代码语言:javascript
复制
SqliteConnection conn("./database.db");
SqliteConnection conn1 = conn;

将导致在每个变量超出作用域时对数据库指针进行两次sqlite3_close调用。当您需要将资源分配给不同的变量时,如何使用RAII克服这一困难?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-18 09:22:43

对于共享资源,您必须跟踪是否存在对它们的引用,例如使用reference counting。一种实现是带有自定义删除器的boost::shared_ptr

代码语言:javascript
复制
class SqliteConnection {
    boost::shared_ptr<sqlite3> native;
public:
    SqliteConnection(const std::string& path) 
      : native(init_connection(path), &destroy_connection)
    {}
    // ...
};

sqlite3* init_connection(const std::string& path) {
    // ...
    return ptr;
}

void destroy_connection(sqlite3* p) {
    sqlite3_close(p);
}
票数 9
EN

Stack Overflow用户

发布于 2010-07-18 09:17:59

将连接放入shared_ptr中。在分配时,您所要做的就是分配“shared_ptr”来共享资源(连接)的所有权。否则,您必须为您的类实现共享所有权,这在boost中已经实现了,并且包含在C++0x中。

票数 3
EN

Stack Overflow用户

发布于 2010-07-18 12:07:04

您有四个基本选项:

  • 使用引用计数,可能是通过shared_ptr。这是效率最低的,但它是最通用的solution.
  • Prohibit赋值。不允许用户复制SQLite对象。将赋值运算符和复制构造函数设为私有。然后用户将不得不传递指针或引用。
  • 让赋值“窃取”资源。这就是auto_ptr所做的。创建副本时,a = b会导致a获得b连接的所有权,并将b设置为NULL值,作为一个空的、不可用的新连接。这取决于提供必要功能的sqlite API。特别是,可能还必须复制查询和其他特定于连接的数据,这可能是不切实际的
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3273944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档