2015-05-12 30 views
1

據我所知,如果成員函數已經被使用指向動態分配的對象的指針調用,該對象將被刪除。但是,如果使用靜態分配的對象調用成員函數,那麼會發生什麼?我可以在成員函數內的這個指針上應用刪除嗎?

class sample 
{ 
    int i; 
    public: 
    void func() 
    { 
     delete this; 
    } 
}; 

void main() 
{ 
    sample *s = new sample; 

    s->fun(); 
    sample s1; 
    s1.fun(); 
} 
+2

提供一個可能的例子嗎? – JCx

+0

應該依賴堆管理,你肯定會遇到一個錯誤,試圖釋放一個無效塊。 – fassl

+0

當你嘗試它時,你的結果是什麼? –

回答

2

只要您知道如何分配指針,刪除成員函數內的指針是可以的。只有一個指針就沒有可行的方法。

如果一個函數被傳遞了一個沒有被動態分配的指針,並且該函數在該指針上調用delete,這是未定義的行爲。而且,即使是分配爲數組的動態對象的指針也不能用常規delete運算符釋放:您必須使用delete[]。一個簡單的規則是,當你不知道指針的起源時,你不要在它上面調用delete

-1

如果您在靜態分配的對象的任何成員函數內調用delete this,那麼調用delete this將在運行時崩潰。因爲當這個對象超出範圍時,編譯器會自動調用析構函數,它將嘗試刪除不再存在的對象。

+0

刪除棧上的對象已經崩潰。 – nwp

2

如果使用new分配對象,則只能使用delete。就那麼簡單。因此,你給出的第一個例子是合法的,第二個例子不是。第二種情況很可能會崩潰,或者更糟糕的是,導致堆損壞和崩潰,看似隨機的內存分配遠離問題。