2014-06-24 124 views
0

我想建立自己的版本的使用鏈接列表方法的std容器之一。每次我得到新的數據時,我都會創建一個新節點並將其放入容器中。當它毀壞的容器時,D'tor將銷燬所有節點。奇怪的容器內存泄漏

奇怪的是,在泄漏檢查後(使用valgrind)它說我每次都有泄漏我插入第一個數據。這是插入代碼:

template<typename A, typename T> 
typename container<A, T>::Iterator Queue<A, T>::insert(
     const A& priority, const T& object) { 
    Iterator head = this->begin(); 
    Iterator tail = this->begin(); 
    this->findElementPlace(priority, head, tail); 
    Node<A, T> *newNode = new Node<A, T>(priority, object); 
    head.node->next = newNode; 
    newNode->next = (tail.node); 
    ++head; 
    (this->Psize)++; 
    return head; 
} 

它讓我引薦給這條線:

Node<A, T> *newNode = new Node<A, T>(priority, object); 

Node類是很基本的:

template<typename A, typename T> 

class Node { 

public: 
    Element<A, T> element; 
    Node* next; 
    Node() : 
       element(), next(NULL) { 
     } 
     Node(const A priority, const T data) : 
       element(priority, data), next(NULL) { 
     } 
     ~Node() { 
     } 
    }; 

沒關係,其中第一數據被存儲,它總是說特定的數據不會被刪除,儘管D'tor負責它。它使用一個擦除功能,從第一個到最後一個擦除所有元素。這是主要的循環:

while ((from < to) && (from < this->end())) { 
    it.node->next = from.node->next; 
    Iterator temp = from; 
    ++from; 
    delete temp.node; 
    (this->Psize)--; 
} 

它刪除迭代器之間的所有節點「從」以迭代器「以」包括「從」,不包括「以」

沒有人知道如何解決這一問題?

+0

任何你不使用某種形式的引用計數智能指針的原因,例如, '的std :: shared_ptr'? – djikay

+0

你的迭代器是什麼樣的? –

回答

0

我發現了這個問題。 迭代器包含索引參數,運算符<比較索引。 問題在於每個循環「this-> end()」都被重新計算,但迭代器「from」和「to」不再相關,因爲它們的索引不再相關。 我爲它們的索引添加了一個更新,所以這次容器中的所有元素都將被釋放。 新的擦除循環是:

while ((from < to) && (from < this->end())) { 
    it.node->next = from.node->next; 
    Iterator temp = from; 
    from.index--; 
    ++from; 
    delete temp.node; 
    (this->Psize)--; 
    to.index--; 
}