簡體   English   中英

C ++指針向量,向量聲明和指針刪除

[英]C++ vector of pointers, vector declaration and deletion of pointers

假設我有一個單例課程:

class Singleton {
public:
    static Singleton* getInstance();
    void doit();
    std::vector<Object*>& getVector();

private:
    std::vector<Object*> _vector;
    static Singleton *instance;
    Singleton();
    ~Singleton();
    Singleton(const Singleton&);
};

class Delegator {
public:
        void main();
}
  • doit方法我填充_vector與對象指針。
  • main()Delegator類,我請getVector()並顯示結果。

鑒於這種抽象,我有以下問題:

  1. 我可以從Delegator刪除指向main()中Object實例的所有指針(顯示結果之后)。 如果是,建議這樣做嗎?
  2. 單身人士會被摧毀嗎? 換句話說,在getVector()返回的引用將始終有效嗎?
  3. 我在getVector()返回對向量的引用,而不是向量的副本。 假設向量僅包含指向對象的指針,並且不會在Singleton類之外修改向量內容,那么返回引用是否有任何效率?

先感謝您

典型的單例模式如下所示(其他變化也是可能的,例如使用引用代替實例的指針)。

單例.h:

class Singleton {
public:
    static Singleton* getInstance();
    ...

private:
    static Singleton *instance;
    Singleton();                 //permit construction of instances
    ~Singleton();                //permit deletion of instances
    Singleton(const Singleton&); //don't provide an implementation for copy-ctr.
};

singleton.cpp:

Singleton *Singleton::instance = 0;

Singleton::Singleton() {
    // init your stuff
}

Singleton::~Singleton() {
}

Singleton *Singleton::getInstance() {
    if(!instance) instance = new Singleton();
    return instance;
}

對於您的情況,您返回單例實例的副本,這違反了單例模式。

要回答您的問題2.永遠不要刪除單例。 但是,我們定義了一個析構函數,以便可以將其設為私有,否則調用者可以delete Singleton::getInstance() ,這不是一個好主意。

話雖如此,單例在大多數情況下被認為是反模式 在大多數情況下,實用程序類更適合。 實用程序類是一個非常相似的概念,但它們實現的是靜態的所有內容,而不是使用實例。 當需要初始化代碼時,請使用init()方法執行此操作(因為不涉及構造函數)。

  1. 這完全取決於您的要求和設計。 從這個角度來看,您呈現的代碼是中立的。

  2. 同樣,這取決於您的設計和實現。 singleton pattern本身並不意味着生存期。 如果您需要在某個生命周期內使singleton有效,則需要通過其他方式(例如,定義它的全局實例)來確保這一點。

  3. 是的,可以提高性能。 vector實例不是一個簡單的array ,除了實際存儲的信息外,還包含大量數據。 如果按值返回,則將復制所有數據(不考慮本次討論的優化)。 同樣,正如在另一個答案中正確指出的那樣,按值返回實際上破壞了singleton pattern

我對您沒有提出的問題的第一個答案是:

不要使用Singleton 這是一種反模式。 這會使代碼更糟。 它破壞了可測試性,並使將來更難修改程序。

這篇非常出色的文章詳細論述了為什么Singleton是個壞主意

要回答您確實提出的問題...

  1. 是的你可以。 當然,這些指針仍將在向量中,因此向量現在將包含大量的懸空指針。 因此,您也應該清除向量。
  2. 有了代碼,您將永遠不會被銷毀。 根據某些定義,使您的Singleton發生內存泄漏。 因此,該引用將始終有效。
  3. 是的,返回參考有很大的性能改進。 復制向量意味着復制向量中的所有元素。 請注意,這意味着將復制所有指針,而不是它們所指向的Object 此外,如果您返回一個副本並使用main函數刪除所有指針,則絕對可以保證其中有一個向量,其中有大量的懸空指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM