c – RAII和分配
发布时间:2020-12-16 10:17:14 所属栏目:百科 来源:网络整理
导读:我为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
我为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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |