[英]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()
並顯示結果。 鑒於這種抽象,我有以下問題:
Delegator
刪除指向main()
中Object實例的所有指針(顯示結果之后)。 如果是,建議這樣做嗎? getVector()
返回的引用將始終有效嗎? 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()
方法執行此操作(因為不涉及構造函數)。
這完全取決於您的要求和設計。 從這個角度來看,您呈現的代碼是中立的。
同樣,這取決於您的設計和實現。 singleton pattern
本身並不意味着生存期。 如果您需要在某個生命周期內使singleton
有效,則需要通過其他方式(例如,定義它的全局實例)來確保這一點。
是的,可以提高性能。 vector
實例不是一個簡單的array
,除了實際存儲的信息外,還包含大量數據。 如果按值返回,則將復制所有數據(不考慮本次討論的優化)。 同樣,正如在另一個答案中正確指出的那樣,按值返回實際上破壞了singleton pattern
。
我對您沒有提出的問題的第一個答案是:
不要使用Singleton 。 這是一種反模式。 這會使代碼更糟。 它破壞了可測試性,並使將來更難修改程序。
這篇非常出色的文章詳細論述了為什么Singleton是個壞主意 。
要回答您確實提出的問題...
Object
。 此外,如果您返回一個副本並使用main
函數刪除所有指針,則絕對可以保證其中有一個向量,其中有大量的懸空指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.