2012-10-25 6 views
0

이것은 B + 트리의 노드입니다. 내 프로그램이 많은 메모리를 유출하기 때문에 스마트 포인터를 사용하고 싶었다. 스마트 포인터를 사용하여 코드를 변환하는 방법은 무엇입니까?간단한 트리 구현에서 스마트 포인터를 사용하는 방법

class node 
{ 

public: 

    long* key; 
    int capacity; 
    node** nodes; 
    node* parent; 
    long* value; 

    node (int order) { 
     key = new long[order + 1]; 
     value = new long[order + 1]; 
     nodes = new node *[order + 2]; 
     capacity = 0; 
     parent = NULL; 
     for (int i = 0; i <= order + 1; i++) { 
      this->nodes[i] = NULL; 
     } 
    } 
    ~node() { 
     delete[] key; 
     delete[] value; 
     for (int i = 0; i <= order + 1; i++) { 
      delete nodes[i]; 
     } 
    } 

}; 
+0

노드가 삭제 될 때 노드를 정리하기 위해 소멸자'node :: ~ node()'를 정의하지 않았기 때문에 메모리 누수가 발생합니다. 이것을 이해하지 못하면 스마트 포인터로 이동하는 것은 좋은 생각이 아닙니다. – paddy

+0

@paddy 전 소멸자를 이해합니다. 이전 버전의 코드를 복사 한 것 같습니다. 미안해. 내가 그것을 업데이트 할거야. –

+2

'delete [] nodes'는 포인터를 삭제하지 않습니다. 당신은 그것을 반복해야만합니다. – paddy

답변

4

스마트 포인터를 사용하지 마십시오. 똑똑하고 하지 사용 포인터, 오히려 용기 수행 심지어 부모가 항상 오면 parentnode &이 (변경되지 제 결코하게 할 수

#include <vector> 

struct node 
{ 
    std::vector<long> keys; 
    std::vector<long> values; 

    std::vector<node *> nodes; 
    node *    parent; 
}; 

당신의 구조의 제약에 따라) 또는 std::reference_wrapper<node> 일 수 있습니다. 하지만 그건 사소한 말입니까.)

+0

그래도 그렇게 생각했지만 다른 사전 데이터 구조의 성능을 비교하려고 노력 중이었고 컨테이너를 사용하면 메모리 할당 및 할당 해제가 내부적으로 여러 번 반복 될 수 있으므로 성능이 저하 될 수 있습니다. –

+0

@hellcoderz : '벡터'의 할당 동작이 명확하게 지정됩니다. 분명히 자신의 코드보다 더 나쁘지 않아도되고 아마도 더 나을 수도 있습니다. –

+0

+1 나를 꺾기 위해, 그리고 그것을 바로 wrt. 단일 키 대 대다수 (눈치 챘을 때 제 대답을 고치는 대신, 방금 삭제했습니다) –