2016-09-06 42 views
3

我有一個指向MySQL連接的指針。只有這個指針和連接是固定的。然而,其他類需要的連接,以便處理這個問題的方法之一是有類是我應該使用shared_ptr還是返回unique_ptr.get()?

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並返回指針的拷貝。在這情況下會選擇一種兩種方法?

+0

那麼什麼是'A'?其他類如何訪問'A'? – Galik

+0

'A'負責檢查所需的MySQL數據庫是否存在並且可用。其他類沒有直接訪問'A',而是需要由'A'管理的連接,通過接收對'conn'的引用作爲其方法中的參數。 –

回答

3

如果您的應用程序的設計方式可以證明在您的A對象的實例超出範圍並被銷燬後無法使用SQL連接,那麼使用unique_ptr並使用get()獲取基礎指針爲足夠。

另一方面,如果可能在此對象被破壞後可能需要使用連接,那麼unique_ptr顯然是不夠的,並且shared_ptr是這裏的順序。

還有其他一些可能的考慮。例如,在需要的地方使A類的實例本身被動態分配,並使用std::shared_ptr<A>來引用它;這通過合同證明,只要需要底層SQL連接,給定的A就會保持存在。在這種情況下,unique_ptr本身並不具有很大的附加價值。但是,如果A在基礎SQL連接之上實現了一些增值功能,採用這種方法可能是有意義的。

+1

另外,如果類「A」的對象真正擁有資源並且指針永遠不能爲null,那麼他應該返回一個引用而不是原始指針。 –

1

如果您的應用程序是多線程的,打開數據庫連接的多個實例更好,因此在每個實例中使用std :: unique_ptr。這將避免共享數據庫資源時出現瓶頸。

相關問題