2013-03-03 55 views
1

在下面的代碼中,我使我的構造函數和析構函數保密,並創建了我自己的實例化和刪除函數。但是當我調用Delete()函數時,它內部的delete this語句似乎刪除了該對象,但未通知編譯器,因此它認爲該對象仍然存在。我認爲將指針設置爲空或零是一個好主意,所以我在刪除語句之前放置了一個this = 0,但它根本不起作用。我應該在Delete()函數裏面放入什麼來完全刪除對象及其指針?如何使用同一類的成員函數刪除當前類實例

class MyClass 
{ 
private: 
    MyClass() {} 
~MyClass() {} 
public: 
    static MyClass *Instantiate() 
    { 
    MyClass *inst = new MyClass; 
    return inst; 
    } 
    void Delete() 
    { 
    delete this; 
    } 
}; 

int main() 
{ 
    MyClass *inst1 = MyClass::Instantiate(); 
    inst1->Delete(); 
    return 0; 
} 
+0

「但不通知編譯器,所以它認爲該對象仍然存在」 - 什麼讓你說這個? – 2013-03-03 17:02:42

+0

@stfrabbit因爲我無法重用對象名稱 – 2013-03-03 17:08:56

+0

請刪除'這個問題可能已經有答案'標籤。我的問題與你提到的問題無關。 – 2013-03-03 17:11:04

回答

3

儘管您沒有明確表達它,但我相信您想知道爲什麼inst1在調用Delete()後不是NULL。如果是這樣,請考慮:

With inst1->Delete();您成功刪除指向的對象inst1。但是,指針inst1保持不變。它只在內存中某處指向不再是MyClass的有效實例。

此外,成員函數調用delete this的情況極其罕見,儘管在語法和語義上,您的示例沒有任何問題。

+0

是的,就是這樣!我應該如何清空指針? (因爲'this = 0'不起作用) – 2013-03-03 17:06:46

+0

@MohammadSanei你不能。 – 2013-03-03 17:08:02

+0

您不能將指針inst1設置爲NULL,因爲您的MyClass實例不知道它。 – 2013-03-03 17:09:41

2

你不能這樣做。指向該對象的指針需要在外部進行管理,因爲對象本身無法訪問它們(this是本地自引用指針,並不代表除此之外的任何內容)。

如果您想保持跟蹤的指針自動,你會使用智能指針類(http://en.wikipedia.org/wiki/Smart_pointer#C.2B.2B_smart_pointers)。但是,既然你使得私密,你失去了這種能力。當然,你仍然可以編寫自己的智能指針類。

相關問題