如果節點用「新」比它需要顯式刪除創建,絕對。他們的問題將在其中。如果您要刪除節點(假定其他人不需要該節點的內容),那麼在完成從樹中刪除節點後,您還應該刪除節點本身。
現在,對節點的引用是另一回事。如果引用是方法參數定義的工件,則不必對它做任何處理。該引用是在堆棧上創建的,以幫助進行方法調用。如果我記得我的C++,引用永遠不會爲null,這意味着永遠不必說你對不起(壞玩笑),呃永遠不必刪除它們。
[編輯] 的OP說,「因爲我在參數傳遞的節點* &,但繼任者僅僅是在功能的節點* ...)」,所以我假定你的意思是這樣的:
void removeNode(Node*& node)
,然後使用
void foo()
{
Node* n = new Node();
// for example
removeNode(n);
}
我的C++是有點生疏但這裏的想法是,「n」是一個指針,但的removeNode(的參數類型)稱爲是一個指針的引用。調用者不知道涉及引用,它只是傳遞'n',期望arg類型成爲指向節點(節點*)。編譯器創建引用作爲參數的包裝,因此只有被調用者知道引用。由於引用是在堆棧上創建的,因此在removeNode()返回時它將被正確地'管理'。由'n'指向的節點仍然需要刪除,問題是哪個代碼應該處理它。
首先想到的是'removeNode()'來做到這一點。一個問題是它只有一個引用,如果你刪除了指針(引用的目標),引用將是空的,這是一個壞主意/不允許。只是想着嘗試它的語法讓我感到害怕。
因此,在客戶端代碼來做到這一點,就像這樣:
void foo()
{
Node* n = new Node();
// for example
removeNode(n);
delete n;
}
基本上,您需要爲您的節點指針範圍的計劃。只要它是一致的,你可以用幾種不同的方式來做到這一點。如果你想讓removeNode()處理刪除操作,那麼將參數類型改爲指針而不是引用,並記錄調用,所以期望它既從樹中刪除節點,也刪除內存。
你能解釋一下嗎? :如果引用是方法參數的工件 – Pacane 2010-11-30 16:03:24
感謝您的解釋。 :-) – Pacane 2010-11-30 16:55:54