我为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克服这一困难?
发布于 2010-07-18 09:22:43
对于共享资源,您必须跟踪是否存在对它们的引用,例如使用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);
}发布于 2010-07-18 09:17:59
将连接放入shared_ptr中。在分配时,您所要做的就是分配“shared_ptr”来共享资源(连接)的所有权。否则,您必须为您的类实现共享所有权,这在boost中已经实现了,并且包含在C++0x中。
发布于 2010-07-18 12:07:04
您有四个基本选项:
shared_ptr。这是效率最低的,但它是最通用的solution.auto_ptr所做的。创建副本时,a = b会导致a获得b连接的所有权,并将b设置为NULL值,作为一个空的、不可用的新连接。这取决于提供必要功能的sqlite API。特别是,可能还必须复制查询和其他特定于连接的数据,这可能是不切实际的https://stackoverflow.com/questions/3273944
复制相似问题