2014-10-31 73 views
0

在下面的代碼:刪除析構函數調用內

class Base { 
public: 
    virtual ~Base(){} 
}; 

class Derived : public Base 
{ 
    Derived* d; 

public: 
    ~Derived() 
    {  
     delete d; 
    } 
    Derived():d(NULL){} 
}; 


int main() 
{ 
    Base* b = new Derived; 
    delete b; 
    return 0; 
} 

並調用delete d;內源性的析構函數導致遞歸在析構函數調用?

+6

只要'd是!= nullptr'就可以。否則'刪除nullptr;'是無操作。 – Jarod42 2014-10-31 08:21:32

+3

取決於如何初始化'd';如果是'this',那麼是的,如果是到另一個對象(例如在鏈中),那麼可能不是(取決於鏈)。 – Niall 2014-10-31 08:22:56

+2

是的,它的確如此。這是一個鏈表的典型例子。 – 2014-10-31 08:26:00

回答

1

其實不,沒有任何析構函數的調用,除了main函數之外的任何析構函數。

Reference on delete

如果表達式是不是一個空指針,刪除表達式調用 析構函數(如果有的話)對於用於被破壞物,或用於 被銷燬該陣列的每個元素(從出發最後一個 元素添加到數組的第一個元素)。

這讓我認爲,因爲d是NULL,那麼析構函數將不會被調用。刪除將執行,但會返回而不執行任何重要的操作。

而且這是很容易的測試由在每析構添加std::cout語句

1

析構函數

Derived::~Derived() {  
     delete d; 
    } 

不落入遞歸作爲d是指向不同的派生對象,而不是相同這個(當前對象),所以即使調用了Derived::~Derived(),也會調用另一個對象,並且當鏈中某處的d爲NULL時最終停止。

相關問題