2014-11-26 4 views
0

나는 포인터와 다이나믹 메모리가있는리스트의리스트를 만들고 있는데, 노드에 의해 구성된 메인리스트이고 각 노드는 또 다른리스트 또는 어떤 종류의 타입 (int, double ...)이 될 수있다. 내가 삭제하려고하면 모든 오류를 나타납니다일반 컨테이너에있는 목록을 삭제하려면 어떻게해야합니까?

C2541: 'delete' : cannot delete objects that are not pointers.

목록의 소멸자 :

목록이 비어 있지 않은 동안, 나는 그것의 첫 번째 요소를 삭제합니다.

template <class T> Lista<T>::~Lista() 
{ 
    while (!es_vacia()) 
    { 
    borrar(1); 
    } 
} 

노드의 소멸자 :

기능 borrar(1) 호출 노드의 소멸자. 그것은 포인터를 null에 두었습니다 (이중 연결리스트입니다). 클래스 T가 포인터 인 경우 (목록이 포함되어 있기 때문에) 삭제되지만 작동하지 않습니다.

template <class T> Nodo<T>::~Nodo() 
{ 
    sig = 0; 
    ant = 0; 
    if (std::is_pointer<T>::value) 
    { 
    delete valor; 
    } 
} 
+0

나는 오류 프롬프트가 간단하다고 생각합니다. –

+2

클래스는 포함해야하는 객체가 아닌 * 노드 *의 할당을 담당해야합니다. 그것은 사용자의 문제입니다. – 0x499602D2

+0

예를 들어, 사용자가'Lista' 클래스를 파기 할 때 자동 할당 해제를 원한다면,'std :: unique_ptr '를 요소 유형으로 전달했을 것입니다. – 0x499602D2

답변

2

나는이 처리하는 더 좋은 방법은 사용자가 목록에 포인터의 소유권을 가져올 경우 그들은 그것을 Lista<std::unique_ptr<T>>를 선언해야 될 것이라고 덧글로 해요. 그런 식으로 다른 방법으로 포인터를 계속 소유하고 싶다면 여전히 옵션이 될 것입니다.

그러나 질문에 대답하십시오 ... 템플릿 매개 변수가 포인터 일 때 포인터를 삭제하는 제네릭 형식을 원할 경우 delete을 항상 포인터 인 클래스 또는 함수로 이동해야합니다. . 그 일을하는 한 가지 방법이 있습니다 :

template <class T, bool isPointer = std::is_pointer<T>::value> 
struct ItemCleanup 
{ 
    // default case, does nothing 
    static void cleanup(T value) { } 
}; 

template <class T> 
struct ItemCleanup<T, true> 
{ 
    // specialized case if is_pointer<T>::value is true 
    static void cleanup(T value) { delete value; } 
}; 

template <class T> 
Nodo<T>::~Nodo() 
{ 
    ItemCleanup<T>::cleanup(valor); 
} 
+0

답변 해 주셔서 감사합니다. 정확히 내가 뭘 찾았는지, 나는 스마트 포인터를 사용하는 방법을 아직 모른다. – alvarete