我应该使用shared_ptr还是返回unique_ptr.get()?

时间:2016-09-06 23:56:39

标签: c++ mysql

我有一个带有指向MySQL连接的指针的类。只有这个指针和连接是恒定的才有意义。但是,其他类需要连接,因此处理此问题的一种方法是使类成为

class A {
     std::unique_ptr < sql::Connection > conn;

   public:
     const sql::Connection* getConnection ();
}

或其变体(例如在const声明中的不同位置返回引用或添加conngetConnection的实现就像

const sql::Connection* A::getConnection() {
  return conn.get();
} 

如果我应该使用std::shared_ptr并返回指针的副本,我会徘徊。在哪种情况下,人们会选择哪种方法?

2 个答案:

答案 0 :(得分:3)

如果您的应用程序的设计方式可以证明在A对象的实例超出范围并被销毁后无法使用SQL连接,那么使用unique_ptrget()获取基础指针就足够了。

另一方面,如果在销毁A对象后可能需要使用连接,那么unique_ptr显然是不够的,这里有一个shared_ptr

还有一些其他可能性需要考虑。例如,在需要的地方动态分配A类本身的实例,并使用std::shared_ptr<A>来引用它;通过契约证明,只要需要基础SQL连接,给定的A仍然存在。在这种情况下,unique_ptr赢得了很多附加值。但是,如果A在底层SQL连接之上实现了一些增值功能,那么采用这种方法可能是有意义的。

答案 1 :(得分:1)

如果您的应用程序是multi_threaded,则最好打开数据库连接的多个实例,因此在每个实例中使用std :: unique_ptr。这样可以避免在共享数据库资源时出现瓶颈。