點解Singleton在multi-threaded environment 唔好

本帖最後由 luckiejacky 於 2015-1-11 11:23 編輯

http://lostechies.com/scottdensmore/2009/08/14/singletons-are-evil-part-2/


C++
我寫左個Singleton class在multi-threaded 環境下有Memory Leak
我在main logic (Application class 內的Destructor destroy 個Singleton
內的Heap objects) 都系有Leak,有什麼方法可以今個program robust D?

  1. class NavmeshSingleton
  2. {
  3. public:
  4.         virtual ~NavmeshSingleton()                               
  5.         {                 
  6.                 delete m_pObj;       
  7.                 delete m_NavMesher;
  8.         }


  9.         // use this object to get obj
  10.         static NavmeshSingleton* GetObj()       
  11.         {  
  12.                 if (!m_pObj) {
  13.                         m_pObj = new NavmeshSingleton();
  14.                        
  15.                 }
  16.                 return m_pObj;
  17.         }
  18.         static void SetObj(NavmeshSingleton* pObj)
  19.         {  
  20.                 m_pObj = pObj;
  21.         }

  22. private:
  23.         static NavmeshSingleton* m_pObj;
  24.         static NavMesher *m_NavMesher;                 

  25. private:
  26.         NavmeshSingleton()               
  27.         {       
  28.                 m_NavMesher = new NavMesher();                                         
  29.                 m_NavMesher->buildNavMesh(((CWarehouse*)g_Objs["Warehouse"])->m_Mesh->GetMesh());          
  30.         }

  31. public:
  32.         void findPath(const D3DXVECTOR3& from, const D3DXVECTOR3& to, std::vector<D3DXVECTOR3>& path) {                          
  33.                 m_NavMesher->findPath(from, to, path);                                  
  34.         }
  35. };
複製代碼


THX

Okay, I explicitly delete the m_NavMesher and m_pObj;
in the main logic class.
And seems not leaking any more

TOP

回覆 2# luckiejacky

可以用std::unique_ptr.

還有要用atomic或mutex去access.

TOP