2015-04-23 31 views
0

我有一個圖形對象,我想爲此創建一個析構函數。然而,我並沒有真正舒適的遞歸,而且我有點迷失在我自己的數據結構中。我將展示涉及的類和我的析構函數的開始。析構函數,圖形和遞歸性

class Graph { 

private : 
     Graph*    parent; 
     vector<Graph>  child; 
     Board    tab; 
     bool     seen; 

public : 
     Graph(const Board&); 
     Graph(const Board&, Graph*); 
     ~Graph(); 
     ... 
}; 

class Board {   
    private : 
     int**   tab; 
     int    nbline; 
     int    nbcolumn; 
     Position  emptyspot; 

    public : 
     Board(); 
     Board(int, int, Play&); 
     Board(int, int); 
     Board(const Board&); 
     Board(int, int, ifstream&); 
     ~Board(); 
     ... 
}; 

位置類只有2個int(行和列)。 董事會析構函數作品:

Board::~Board() 
{ 
    for(int i = 0; i < this->nbline; i++) { 
     delete tab[i]; 
    } 
    delete tab; 
} 

正如你猜到了,我想破壞我圖的節點,並且所有的以下節點。

這裏是我的beggining:

Graph::~Graph() {   
    while(!child.empty()) {     
     for(vector<Graph>::iterator itr = child.begin; itr != child.end; ++itr) { 
      delete child[itr]; 
     } 
    } 
} 

這樣,我進入我的所有分支,遞歸,對不對?當我找到一片葉子(矢量爲空)時 - 如果摧毀了所有東西,父母的矢量中會發生什麼?我不知道父母是否會將自己設置爲NULL(我不這麼認爲),並且父向量內存空間不會被未分配,因此child.empty()條件將不會被滿足,對 ?

  • 如何以及何時銷燬* Graph?

  • 我會冒堆棧溢出嗎?

    • 我可以在我開始刪除的根節點中調用vector.erase(),以便遞歸銷燬所有內容而不是執行for-loop?
+0

是小孩矢量或矢量?你有'矢量',但你打電話給刪除,所以我很困惑。 – NathanOliver

+0

這是我的一個錯誤,它應該是矢量,我將不得不更改構造函數^^' – Csi

回答

2

您的析構函數由於諸多原因而不正確。

  1. child成員大概應該是vector<Graph*>,這樣你實際上可以delete他們。
  2. 如果你的Graph有任何孩子,你的循環是無限的,因爲你永遠不會改變child矢量的大小
  3. child[itr]是不是你如何得到Graph*對應的迭代器,*itr是。
  4. beginend是成員函數,所以需要調用它們。
  5. 該成員應該可能被命名爲children,否?

正確的循環是:

for (vector<Graph*>::iterator itr = children.begin(); itr != children.end(); ++itr) { 
    delete *itr; // this will recursively call Graph::~Graph() 
       // on the children, and then free their memory 
} 

或者,在C++ 11中,我們簡單地定義:

std::vector<std::unique_ptr<Graph>> children; 

,使內存清理將是我們處理。

+0

@Csi:如果您沒有C++ 11功能,請選中[Boost Smart Pointers](http:/ /www.boost.org/doc/libs/release/libs/smart_ptr/smart_ptr.htm)。它們基本上都是用C++ 98的手段實現的。 – DevSolar

+0

@DevSolar我沒有權利使用Boost; _;老師是非常老派:'( – Csi

+0

@DevSolar Thx哥們:-)我在人們的建議之後通過修改回答了這個話題,現在是否正確? – Csi