2014-06-24 1 views
0

연결된 목록 방법을 사용하여 표준 컨테이너 중 하나의 자체 버전을 빌드하려고합니다. 새 데이터를 얻을 때마다 새 노드를 만들어 컨테이너에 넣습니다. D' tor은 컨테이너가 파괴되었을 때 모든 노드를 파괴합니다.이상한 컨테이너 메모리 누수

이상한 일은 누수 검사 후 (valgrind 사용) 누수가있을 때마다 내가 첫 번째 데이터를 삽입한다는 것입니다.

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

노드 클래스는 매우 기본적인 : 그것은이 라인에 저를 언급 유지

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; 
} 

:

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--; 
}