2016-09-13 237 views
1

如果析構函數受到保護,爲什麼不允許在堆棧上分配對象,但在堆上分配是允許的?受保護的堆對象堆棧vs堆棧分配

class Foo 
{ 
    public: 
    Foo() 
    { 
    } 
    protected: 
    ~Foo() 
    { 
    } 
}; 

int main() 
{ 
    Foo* objOnHeap = new Foo(); // compiles fine 
    Foo objOnStack; // complains that the destructor is protected 
    return 0; 
} 
+2

因爲你不是通過'刪除'摧毀它,dtor將不會被調用。 – songyuanyao

+0

我沒有爲堆上的對象調用'delete'。對於堆棧中的對象,當它超出範圍時會被刪除。 – arunmoezhi

+0

是的,這是區別;該dtor是否被調用。 (隱含或明確無關緊要) – songyuanyao

回答

3

當創建具有自動存儲時間(標準的術語,你所謂的「堆棧」)的對象,它是隱式銷燬當對象超出範圍。這需要一個可公開訪問的析構函數。當您使用new動態分配對象時,這不會發生。動態分配的對象只有在明確使用時纔會被銷燬(例如使用delete)。你並沒有試圖這樣做,所以你不會有錯誤。你會得到一個錯誤,如果你這樣做:

delete objOnHeap; 
+0

啊..有道理。謝謝。 – arunmoezhi

+0

很好的解釋。即使這個** std :: unique_ptr p(new Foo()); **會抱怨,因爲它使用裏面的delete。 – blackpen