這不是線程安全的:調用getInstance
的兩個線程將導致數據競爭。一種常見的方法是使用一個函數作用域的靜態變量:
static shared_ptr<Demo> getInstance(){
static shared_ptr<Demo> d(new Demo);
return d;
}
這種可變是保證準確地一旦被初始化,當控制越過其首次定義,並且在線程安全的方式。
在這一點上,雖然它不完全清楚你爲什麼想要使用shared_ptr
。你也可以做
static Demo& getInstance(){
static Demo d;
return d;
}
這是一個單身人士(好,其中之一)的教科書實施。
回覆:用私有構造函數初始化。我不確定我瞭解你的困惑的本質。你問爲什麼Demo::getInstance
可以使用Demo
的私人構造函數?那麼,因爲它是Demo
的成員,並且類的成員可以訪問該類的私有成員。你問爲什麼Demo::getInstance
可以調用shared_ptr<Demo>::reset()
傳遞Demo*
指針?那麼,因爲reset()
是shared_ptr
的公共成員函數,將一個指針作爲參數。這個過程的哪一部分你有爭議?
單身更是一種反模式,所以我建議不要實施它們。它們與全局變量沒有什麼不同。 – Jens
雖然很多人都認爲單身使用不明智可能會造成問題,但我認爲在這裏批評它們並不是特別有用 - 它不會幫助提問者解決問題。 –