我有兩個類,BASE_CLASS和derived_class和以下代碼:經由指針刪除派生對象到它的基類
base_class *ptr = new derived_class;
delete ptr;
將這個代碼產生內存泄漏?如果是這樣,我該如何處理?
我有兩個類,BASE_CLASS和derived_class和以下代碼:經由指針刪除派生對象到它的基類
base_class *ptr = new derived_class;
delete ptr;
將這個代碼產生內存泄漏?如果是這樣,我該如何處理?
它不會泄漏你正在刪除的對象,它的內存塊將被釋放。
如果您還沒有宣佈base_class
析構函數是虛擬的,然後它會泄漏包含在derived_class
依賴的derived_class
析構函數中的任何動態分配的對象被稱爲釋放他們。這是因爲如果析構函數不是虛擬的,則在這種情況下不調用derived_class
析構函數。這也意味着derived_class
中的「嵌入對象」的析構函數不會自動被調用,這是一個單獨的但附加的問題,它可能導致進一步的泄漏和重要清理代碼的不執行。
簡而言之,聲明base_class
中的析構函數是虛擬的,您可以安全地使用您提供的技巧。
對於編碼例如,參見:
In what kind of situation, c++ destructor will not be called?
謝謝,這回答了我的顧慮 – 2012-01-07 11:36:30
的代碼不能編譯。我建議首先通過編譯器傳遞它。更好的是:'base_class * ptr = new derived_class();' – 2012-01-07 10:41:48
如果'base_class'沒有虛擬析構函數,這將觸發未定義的行爲(§5.3.5/ p3) – 2015-05-06 17:39:39