2017-01-14 67 views
1

我已經構建了一個自定義的數據結構,這就像一個雙向鏈接的RBTree,雖然邏輯看起來很好,但我沒有看到當我刪除一個節點時發佈任何內存。C++指針結構不會被刪除

這是我的節點聲明:

typedef struct rbtreere_node 
{ 

public: 
    NMessage *n_message; 

    // Node Specific // 
    enum color color_ID; //<<--- Color for ID side of RBTreeRe 
    enum color color_Price; //<<--- Color for Price side of RBTreeRe 
    int id;     //<<--- Unique Identifier. 
    rbtreere_node *left_ID, *right_ID, *parent_ID, *left_Price, *right_Price, *parent_Price; 

}*node; 

當我打電話給我的刪除功能,我結束我的回報之前delete n。 我檢查,如果我嘗試返回之前訪問任何node n的數據,它仍然存在...

即我打電話這樣的:

delete n; 
std::cout << n->color_ID<<"\n\n"; 

,它並返回一個節點顏色

我應該爲它構建一個自定義的析構函數嗎?

我也有node message作爲一個變種,而不是一個指針,但似乎沒有任何改變......

編輯:我的問題是,我沒有看到在內存使用任何下降後刪除任何或甚至所有節點。我應該如何處理它?

+0

執行'delete n;'操作後,您可以強制指針指向'n = NULL;'...無法恢復數據。 –

回答

3

我檢查,如果我嘗試返回之前訪問任何節點n的數據,它仍然存在...

delete n; 
std::cout << n->color_ID<<"\n\n"; 

提領n它已被刪除後已未定義行爲。

我應該爲它構建一個自定義的析構函數嗎?

否。除非n_message擁有它指向的內存,在這種情況下,隱式析構函數會泄漏該內存。

我的問題是,刪除任何或甚至所有節點後,我看不到任何內存使用情況下降。

大部分malloc實現(這是由new實施通常用於動態內存分配)永遠不會返回釋放的內存給操作系統。相反,它將其用於後續分配。這是一個非問題。

我應該如何處理它?

除了擺脫有UB的「檢查」,沒有。一切似乎都如預期。

2

delete只取消分配內存並調用對象的析構函數。它不會擦除內存或做任何類似的事情。除非你需要(例如安全),否則這只是浪費時間和代碼。在delete之後,您可以(顯然是)仍然指向內存並對其進行解引用。這是非常危險的,因爲它是未定義的行爲。

+0

調用析構函數怎麼樣?在刪除內存之前,'delete'會調用dtor(如果有的話)。 –

+0

我的問題是,在刪除任何或甚至所有節點後,我看不到內存使用情況的任何下降。我應該如何處理它? – Ant

+0

@LucaCappa當然是的,但是由於OP正在刪除內存,因此似乎沒有任何理由要刪除OP引用的'color_ID'字段的內容。所以他/她只能看到這個值,因爲操作系統已經重新定義了內存。 –