RAII和任务

dzh*_*lil 3 c++ raii assignment-operator

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

SqliteConnection conn("./database.db");
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够共享此连接,将其存储为类中的成员等,并且问题在于默认赋值运算符operator=.做点什么

SqliteConnection conn("./database.db");
SqliteConnection conn1 = conn;
Run Code Online (Sandbox Code Playgroud)

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

Geo*_*che 9

对于共享资源,您必须跟踪存在的对它们的引用,例如使用引用计数.一个实现是boost::shared_ptr使用自定义删除器:

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);
}
Run Code Online (Sandbox Code Playgroud)