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

3

我有一个指向MySQL连接的类指针,让这个指针和连接常量化是很有意义的。然而,其他类需要这个连接,因此应对这种情况的一种方式是让该类成为

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

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

或者它的变体(比如在声明“conn”时返回引用或添加“const”)。函数“getConnection”的实现如下:
const sql::Connection* A::getConnection() {
  return conn.get();
} 

我在思考是否应该使用 std::shared_ptr 并返回指针的副本。在哪种情况下会选择其中一种方法?


那么A是什么?其他类如何访问A - Galik
A 负责检查所需的 MySQL 数据库是否存在并可用。其他类没有直接访问 A,而是需要由 A 管理连接,通过在其方法中接收对 conn 的引用作为参数来实现。 - Reimundo Heluani
2个回答

3
如果你的应用程序经过设计,可以证明在你的 A 对象超出范围并被销毁后不能使用 SQL 连接,则使用 unique_ptr 并使用 get() 获取基础指针即可。
另一方面,如果可能需要在销毁此 A 对象之后继续使用连接,则显然 unique_ptr 不足以胜任,这时需要使用 shared_ptr
还有其他一些情况需要考虑。例如,动态分配 A 类的实例,并在需要使用它的地方使用 std::shared_ptr<A> 引用它,从而通过合同证明给定的 A 在底层 SQL 连接需要时仍然存在。在这种情况下,unique_ptr 本身没有多少附加值。但是,如果 A 在底层 SQL 连接上实现了一些增值功能,采用这种方法可能是有意义的。

1
此外,如果类A的对象真正拥有资源并且指针永远不会为空,则应该返回引用而不是原始指针。 - Barrett Adair

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接