2013-01-09 15 views

回答

0

new coral::PropertyManagernew coral::PropertyManager在堆上分配一個新的PropertyManager,但是因爲它是一個臨時變量,您永遠不會釋放它。這是標準的Java成語,因爲Java是一種垃圾收集語言,GC將負責爲您發佈這個懸而未決的參考。

如果你想在這裏使用new出於某種原因,正確的方式做這將是如下:

auto *pm = new coral::PropertyManager; // auto is C++11 syntax 
m_propertyManager(pm); 
delete pm; // when you're done using it 

你的第二個選擇是正確的,因爲它分配Mgr上的自動變量堆棧,當函數退出時它將被釋放。 m_propertyManager(&Mgr);將Mgr的地址傳遞給該函數,該函數將允許它修改Mgr對象(儘管這可能通過將Mgr作爲參考進行更好地完成)。

請注意,如果m_propertyManager是在當前作用域退出後仍然存在的對象,並且它在某處存儲對Mgr的引用,那麼當您退出當前作用域並且Mgr對象被銷燬時,您會發現m_propertyManager持有引用無效的記憶。

+0

更好的辦法是使用的std ::類似的unique_ptr m_propertyManager(標準::的unique_ptr(新珊瑚:: PropertyManager中)); – mgr

+0

@mgr:我可能弄錯了,但不是這樣,你不能將一個唯一指針的副本傳遞給一個函數嗎?在這個用例中std :: shared_ptr是不明智的選擇,糾正我的錯誤。 – Skalli

+0

是的你是對的,這裏需要一個共享指針。 – mgr

0

如果您使用new分配內存,則必須使用delete在某處將其釋放。如果m_propertyManager不應該管理PropertyManager的生命週期,它只會丟棄指針而不分配存儲空間而無法訪問。

另一方面,您的第二個解決方案將崩潰​​。看:

{ 
    coral::PropertyManager Mgr; 
    m_propertyManager->SetManager(&Mgr); // You pass pointer to Mgr here 
} 
// Here Mgr no longer exists, so m_propertyManager 
// now contains the pointer to non-existing object 

您應該:

  • 創建PropertyManager動態(使用new),冥冥之中持有它的指針和自由它明確在使用delete一些點;
  • PropertyManager實現移動構造函數和按值傳遞(這樣m_propertyManager將隱式自動分配自己的PropertyManager實例)
  • 使用靜態分配(在你的第二個例子),但保留該實例的地方,在那裏將保持活着至少只要m_propertyManager
  • 使用某種自動指針(比如std :: shared_ptr的或std ::的unique_ptr)內m_propertyManager