2013-06-27 131 views
0
void node::assign_childs() 
{ 
    node *childs; 
    childs = new node[8]; 
    . 
    . 
    . 
    child_pointer = &childs[0]; 
} 

我很難找到一種方法來釋放「child_pointer」的內存。 「child_pointer」在struct「node」中定義,如下所示。在C++中釋放對象的內存

struct node{ 
    vect p; 
    vect norm; 
    float s; 
    unsigned char r,g,b; 
    int fac_c; 
    vector<int> cfac; 
    bool isParent; 
    bool filled; 

    struct node* child_pointer; 

    node(vect, float , vect); 
    ~node(); 

    void assign_childs(); 

}; 

使用刪除來釋放child_pointer似乎不起作用,我也試過刪除[]。

我怎麼能建立一個析構函數釋放所有child_pointers從根節點遞歸下降?

(這是一個八叉樹,所以當我釋放一個節點節點也被釋放的時候內的所有節點)

如果我不得不改變我給你/的方式定義child_pointer使其能夠釋放它。我會怎麼做?使用8個指針的數組不是一種選擇,因爲它會使用多少內存。

這裏是我試過的析構函數。

node::~node(){ 
    if (child_pointer != NULL){ 
     delete [] child_pointer; 
    } 
} 

這樣做會導致我的程序出現分段錯誤。

node *octree(...); 
. 
. 
. 
delete octree; 
+0

以什麼方式看起來不起作用? – molbdnilo

+0

沒有內存被釋放,如果我創建和刪除八叉樹內存積累和程序崩潰時,我用盡內存。 – lasvig

+0

很確定在NULL指針上調用delete []是很安全的,所以如果可能不需要的話。 –

回答

2

只需添加在您的析構函數如下:

delete[] child_pointer; 

刪除會叫孩子們的析構函數,它們刪除將調用孩子的孩子等

只是展示瞭如何的析構函數刪除和刪除[]用於:

int *foo = new int; 
delete foo; 

int *bar = new int[42]; 
delete[] bar; 
+0

我覺得很快就會有一條3貼的規則。非微不足道的破壞者要求它... –

+0

我竭盡全力阻止它。 – Marius

+0

這就是我想要的工作,但我不能做這項工作。用我擁有的析構函數更新我的問題。 – lasvig