2016-08-19 83 views
0
#include<bits/stdc++.h> 
using namespace std; 
class A { 

public : 
    ~A(){ 
    cout << " A is destroyed " << endl; 
    } 
}; 

class B : public A 
{ 

public : 
    ~B(){ 
     cout << " B is destroyed " << endl; 
    } 
}; 
int main() 
{ 
    B obj; 
    B * p = &obj; 
    delete p; 
    return 0; 
} 

在我建立類B,它繼承類A 當我使用的指針中刪除該對象,析構函數被調用,並打印信息但隨後的僅一個對象的主要功能,我不能夠了解爲什麼析構函數被稱爲兩次只創建一個對象,仍然調用析構函數2次。爲什麼?

+0

你應該發佈程序的輸出。 –

+5

@BiagioFesta:在這種情況下,這將毫無意義。此外,你如何張貼那些鼻子惡魔? – MSalters

+0

@BiagioFesta ...我很抱歉,但我無法粘貼我的輸出。我是新用戶,不知道如何去做。對不起:| –

回答

11

因爲你在堆棧中有一個變量,所以析構函數會在作用域的末尾被自動調用。

B obj; // <- Constructor called. 
B * p = &obj; 
delete p; // <- Bad, undefined behaviour, but destructor called. 
return 0; // <- Destructor called as `obj` goes out of scope. 

您造成未定義行爲這一行:

delete p; 

請記住,你應該永遠只能刪除您已明確創建的內存(即new)。

+0

你的意思是說,當我用「刪除」關鍵字刪除一個對象時,它仍然在內存中有空間? –

+3

@NeerPatel不,我的意思是這樣做會導致未定義的行爲。你永遠不應該'刪除'你沒有'新'的東西。 –

+0

好的。得到它了。我幾乎明白你在說什麼。但仍然想要你的意見。這是否意味着,可以使用「刪除」關鍵字刪除在**堆**部分中分配的所有對象(動態分配)。但是,存儲在** stack **部分的對象不會通過使用「delete」關鍵字刪除? –

3

當執行第delete p;行時,第一次析構函數被調用。第二次 - 當B obj;超出您的範圍main

3

如果您在堆棧中創建一個對象,就像在這種情況下一樣,您不應該對其調用delete。 該對象將在作用域(封閉)結束時自動銷燬。 要回答你問題致電刪除致使兩次調用析構函數

+0

有幫助。謝謝 –

相關問題