該問題的一般答案是使用::std::shared_ptr
。或者如果你沒有那個,::std::tr1::shared_ptr
,或者如果你沒有那個,::boost::shared_ptr
。
你的具體情況,我建議的幾種不同的方法之一:
一種可能性是,當然,shared_ptr的方法。你基本上把你的指針傳給每個需要這個對象的人,當它們不再需要它時,它會自動銷燬。雖然如果你的紋理管理器最終會指向指向它的對象的指針,那麼你正在創建一個引用循環,並且這必須非常仔細地處理。
另一種可能性就是將其聲明爲main
中的局部變量,並將其作爲指針或引用傳遞給需要它的所有人。在你的程序完成之前,它不會消失,你不必擔心管理生命週期。在這種情況下,裸指針或引用就好了。
第三種可能性是類似單身人士那種模糊的可接受用法之一。這值得詳細解釋。
你做一個單身人士只是工作是分發有用的指針。它具有的一個關鍵特性是能夠告訴它將指針指向什麼東西。這有點像全球可配置的工廠。
這使您可以擺脫一般單身人士創造的巨大測試問題。只要告訴它在需要測試時就發出一個指向存根對象的指針。
它也允許你逃離訪問控制/安全問題(是的,它們也會產生安全問題),單身人士代表出於同樣的原因。您可以暫時告訴它傳遞一個指向一個對象的指針,該對象不允許訪問您即將執行的代碼段不需要訪問的內容。這個想法通常被稱爲最低權力原則。
使用此功能的主要原因是,它可以節省您找出誰需要您的指針並將其交給他們的問題。這也是不使用它的主要原因,認爲通過對你有好處。你還介紹了這樣一種可能性,即由於你沒有預料到的控制流,兩個預期會得到與紋理管理器相同指針的事物實際上會獲得指向不同紋理管理器的指針,這基本上是導致你的粗糙思維的結果首先使用Singleton。最後,單身人士是如此可怕,即使這種更溫和的使用他們也會讓我發癢。
個人而言,你的情況,我建議的方法#2,只是main
創建它在堆棧上,並傳遞一個指針,無論它的需要。它會讓你更仔細地考慮你的程序結構,而這種對象應該可以適用於整個程序的整個生命週期。
爲什麼不直接聲明你的texture_manager的全局實例?如果處理正確,全局並不是邪惡的。而且它們在線程化環境中的危險性不及任何其他實例傳遞給多個客戶端...... – Mordachai