c++ - RAII 和赋值

标签 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);
    }
}

然后可以如下初始化连接

SqliteConnection conn("./database.db");

但是,我希望能够共享此连接,将其作为成员存储在类中等,而问题在于默认赋值运算符operator=。做类似的事情

SqliteConnection conn("./database.db");
SqliteConnection conn1 = conn;

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

最佳答案

对于共享资源,您必须跟踪是否存在对它们的引用,例如使用 reference counting .一种实现是 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);
}

关于c++ - RAII 和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3273944/

相关文章:

c++ - 在可移动和不可复制的类上使用移动和交换习语是否有意义

c++ - gcc命令行中静态库的cpptask排序

c++ - 缓存行对齐(需要在文章中说明)

c++ - 在析构函数中检测事件异常

c++ - Google Test 中的 RAII 内存损坏

powershell - 使用嵌套脚本 block 确定问题的范围,然后尝试…最终

C++:二叉搜索树 end() 迭代器

c++ - 如何调查和修复 libpjsua2.so 崩溃

c++ - "checking for self-assignment"有什么问题,它是什么意思?

c++ - 分配给构造函数? (像一个元组层)