2014-03-13 53 views
0

我遇到了「重新定義」析構函數的問題。事情是我已經給了一個結構的定義,我不能修改。它是一棵樹的「葉子」。目標是僅釋放一部分樹,同時返回一個指向剩餘子樹的指針。我的想法是使用引用計數。 這是給定的代碼:是否有可能重新定義析構函數?

struct TLeaf { 
    TLeaf* m_L; 
    TLeaf* m_R; 
    ~TLeaf(void) { 
    delete m_L; 
    delete m_R; 
    } 
} 

有至少辦法避免調用這個析構函數?其實任何想法都是可以接受的。 :D

非常感謝Stack Overflow的好人。 :)

+0

你是說,你不能改變這個代碼?你需要在子類中定義新的行爲? – payo

+0

覆蓋刪除操作符(不要這樣做) –

+3

如果它是__leaf__,它不應該是樹中的最後一個節點嗎?如果是這樣 - 它不應該有子樹。 –

回答

4

您可以nullptr刪除節點之前的值。 delete ptr其中ptrnullptr是安全的,什麼也不做

TLeaf* ltmp = node->m_L; 
TLeaf* rtmp = node->m_R; 

node->m_L = nullptr; 
node->m_R = nullptr; 

delete node; 

// now use ltmp and rtmp as you need 
0

既然你不能修改TLeaf,你可以做的是修改用戶代碼。 0)如果您使用堆分配,請嘗試使用operator delete(p)而不是delete p

1)如果你正在使用的堆棧分配,避免直接使用型TLeaf

char leaf[sizeof(TLeaf)]; 
new (leaf) TLeaf(...); // placement new 
相關問題