2013-12-11 67 views
3

可以說我有一個基類和派生類:使用指向派生類的指針初始化auto_ptr是否安全?

class Base 
{ 
    public: 
     virtual ~Base() {} 
     virtual void DoSomething() = 0; 
}; 


class Child : public Base 
{ 
    public: 
     virtual void DoSomething() 
     { 
      // Do Something 
     } 
}; 

它是安全初始化的std ::基類的指針類型的auto_ptr的派生類的實例? I.E.會創建一個這樣的對象:

std::auto_ptr<Base> myObject(new Derived()); 

正確地調用派生類的析構函數而不是基類沒有泄漏內存?

+0

這個問題不依賴於auto_ptr,是嗎?它涉及所有的指針。如果你不能這樣做,你不可能在C++中擁有多態性,這會讓人難過。 –

+0

@PeterSchneider此問題特定於auto_ptr。主要我想確保它的[實現沒有切片傳入的對象](http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c),但我也想要學習像虛擬析構函數那樣的陷阱。 – TwentyMiles

回答

5

儘管從C++ 11到來後不再使用std::auto_ptr

是的,這是安全的只要你的基地有虛析構函數

如果沒有基礎上的虛擬析構函數(如下面提到的Steve Jessop),您將會遇到未定義的行爲,因爲派生類的析構函數在銷燬時是未知的,因此不會被執行。這是一個危險的問題,因爲在很多情況下它一直未被注意到。例如,如果你想在單一繼承類中管理某種資源,那麼應該已經在析構函數中釋放了資源,那麼就會悄無聲息地發生泄漏。

+1

請注意,使用基類沒有虛擬析構函數的基類指針來刪除對象是未定義的行爲。一個可能的結果是內存泄漏,但任何事情都是允許的,所以可能會更糟。例如,在存在多重繼承的情況下,它可能會崩潰或破壞內存分配器使用的數據結構。 –

+0

謝謝,補充說我的答案。 –

0

只要你的類Basestd::auto_ptr<Base>是參數化有一個virtual析構函數可以初始化std::auto_ptr<Base>與派生的類Base,他們將如果std::auto_ptr<Base>析構函數實例化時Base定義可見妥善銷燬。