-4

所以我似乎無法找出爲什麼我泄漏內存,任何人都可以幫忙嗎?我已經實現了一個二叉搜索樹operator=:二元搜索樹賦值運算符內存泄漏

BinTree& BinTree::operator=(const BinTree &other) 
{ 
    if (other.root == NULL) 
     root = NULL; 
    else 
    { 
     copyHelper(root, other.root); 
    } 
    return *this; 

} 

copyHelper:

void BinTree::copyHelper(Node *&current, const Node *other) 
{ 
    if (other == NULL) 
     current = NULL; 
    else 
    { 
     current = new Node; 
     current->data = other->data; 
     copyHelper(current->left, other->left); 
     copyHelper(current->right, other->right); 
    } 
} 

我明白current = new Node;是在泄漏發生的事情,但我的程序崩潰,如果我嘗試在該行之前做delete current;

這裏是我的析構函數:

BinTree::~BinTree() 
{ 
    destroyRecursive(root); 

} 

void BinTree::destroyRecursive(Node *node) 
{ 
    if (node) 
    { 
     destroyRecursive(node->left); 
     destroyRecursive(node->right); 
     delete node; 
    } 
} 
+0

那麼你的'Node'析構函數是什麼樣的?注意你還需要深入複製'data',不清楚這是否發生。 – EJP

+1

你不會顯示一個'delete',所以任何人應該怎麼評論潛在的泄漏? – John3136

+0

@EJP我加了析構函數 – user3138251

回答

1

由於您使用原始指針,你必須手動刪除分配的內存。當您設置currentNULL

void BinTree::copyHelper(Node *&current, const Node *other) 
{ 
    if (other == NULL) 
    { 
     delete current; // w/o this line next 
     current = NULL; // will cause memory leak (if not managed somewhere else) 
    } 
    else 
    { 
     current = new Node; 
     current->data = other->data; 
     copyHelper(current->left, other->left); 
     copyHelper(current->right, other->right); 
    } 
} 
+1

如果我在那行添加「delete current;」該程序崩潰.. – user3138251

+0

Pls,使[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。從發佈的代碼中找到理由是不可能的。 –

0

可憐的代碼結構,你會泄漏內存。 C++爲您提供了完成這項任務的所有工具,但您只需要很少或沒有任何優勢。您需要刪除當前樹的的根目錄,在運算符功能中的,然後copy-construct新的節點;你需要修復你的析構函數。

  1. 的遞歸複製助手應該在Node類拷貝構造函數:

    Node::Node(const Node &other) : left(0), right(0) 
    { 
        this->data = other.data; // This must be a deep copy 
        if (other.left) 
         this->left = new Node(other.left); 
        if (other.right) 
         this->right = new Node(other.right); 
    } 
    
  2. 這是由BinTree賦值運算符稱爲:

    BinTree& BinTree::operator=(const BinTree &other) 
    { 
        delete root; 
        this->root = 0; 
        if (other.root) 
         this->root = new Node(other.root); 
        return *this; 
    } 
    
  3. 你不需要遞歸銷燬方法。所有你在BinTree析構函數需要的是delete root;,併爲Node析構函數:

    Node::~Node() 
    { 
        delete left; 
        delete right; 
    } 
    
  4. data的複製必須是深拷貝。例如,如果它是C字符串,請在Node的析構函數中使用strdup(),free()。如果它是一個類,那個類必須有一個賦值操作符。

+0

節點必須是此練習的結構,我可以從那裏做什麼? – user3138251

+0

沒有什麼區別,它仍然可以有運算符和構造函數和析構函數。奇怪的要求。 – EJP