我有一个带有指向MySQL连接的指针的类。只有这个指针和连接是恒定的才有意义。但是,其他类需要连接,因此处理此问题的一种方法是使类成为
class A {
std::unique_ptr < sql::Connection > conn;
public:
const sql::Connection* getConnection ();
}
或其变体(例如在const
声明中的不同位置返回引用或添加conn
。getConnection
的实现就像
const sql::Connection* A::getConnection() {
return conn.get();
}
如果我应该使用std::shared_ptr
并返回指针的副本,我会徘徊。在哪种情况下,人们会选择哪种方法?
答案 0 :(得分:3)
如果您的应用程序的设计方式可以证明在A
对象的实例超出范围并被销毁后无法使用SQL连接,那么使用unique_ptr
, 1}}使用get()
获取基础指针就足够了。
另一方面,如果在销毁A
对象后可能需要使用连接,那么unique_ptr
显然是不够的,这里有一个shared_ptr
。
还有一些其他可能性需要考虑。例如,在需要的地方动态分配A
类本身的实例,并使用std::shared_ptr<A>
来引用它;通过契约证明,只要需要基础SQL连接,给定的A
仍然存在。在这种情况下,unique_ptr
赢得了很多附加值。但是,如果A
在底层SQL连接之上实现了一些增值功能,那么采用这种方法可能是有意义的。
答案 1 :(得分:1)
如果您的应用程序是multi_threaded,则最好打开数据库连接的多个实例,因此在每个实例中使用std :: unique_ptr。这样可以避免在共享数据库资源时出现瓶颈。