2014-02-21 3 views
3

나는 ArrayList에 구현하는 방법에 내 데이터 구조의 책을 읽고 있어요, 그리고는 삭제 기능에 대한 다음과 같은 코드를 가지고 : 나는 '이 코드에서 소멸자가 호출되는 이유는 무엇입니까?

template<typename T> 
ArrayList<T>::~ArrayList() { 


delete [] dynArr; 


} 

:로

template <typename T> 
void ArrayList<T>::erase(int index) { 

    //Delete the element whose index is "index" 
    //Throw illegalIndex exception if no such element 
    checkIndex(index); 



    std::copy(dynArr+ index + 1, dynArr + listSize, dynArr + index); 

    dynArr[--listSize].~T(); //invoke destructor 


} 

소멸자가 정의를 정확히 무슨 일이 벌어지고 있는지 혼란 스럽네. 소멸자가 삭제 될 필요가있을 때 전체 배열을 삭제할 수 있습니까?

+1

클래스의 소멸자가 아닌 dynArr 요소의 소멸자를 호출하십시오. ArrayList – Felix

+0

현실 세계에서는이 유형의 코드를 거의 보지 않아야합니다. 컴파일러가 소멸자를 99.99 %의 시간 동안 호출하도록합니다. – jia103

답변

2
T의 소멸자 ( ArrayList<T>의하지 소멸자)라고하며 힙에 개별적으로 미리 할당 된 배열에 생성하지 타입 T의 객체가 될 때 하나 그래서 특별한 placement new operator

를 사용하기 때문에 그것은 가능성이

메모리를 해제 할 필요는 없지만 소멸자를 호출하여 상태를 정리할 수 있습니다.

새 연산자로 메모리에 주소가 지정된 객체를 생성 할 수 있습니다. 이것은 라이브러리 (예 : std :: vector)가 미래의 구조체를위한 메모리 블록을 할당하게합니다. 그리고 그 블록의 특정 위치에 배치 new 연산자 빌드 클래스 인스턴스를 사용하여 : 그러나 당신이 메모리를 소유하지 않기 때문에 당신이 delete을 할 수없는 개체를 제거하려는하지만 당신은 여전히 ​​소멸자를 호출 할 때 void* operator new (std::size_t size, void* ptr) throw();

그것은 자신의 상태를 정리할 것입니다.

표준 : AFAIK이는 소멸자가 마지막 객체에서 호출하지 인덱스에 이유를 언급하는 dtor에 직접

편집 설명을 호출 할 적절한 유일한 사용 사례입니다 : 이처럼 좀 자신의 할당 연산자를 사용하여 복사합니다 '사본'객체 : 시간의

template<class InputIterator, class OutputIterator> 
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result) 
{ 
    while (first!=last) { 
     *result = *first; 
     ++result; ++first; 
    } 
    return result; 
} 

그래서 연산자 = 객체로 호출됩니다 많은. 장소 색인에있는 객체는 장소 색인 + 1에있는 객체로 덮어 씁니다. 적절한 할당 구현을 통해 자체 리소스를 릴리스하고 대상 리소스의 정확한 복사본을 만들 수 있습니다. 이 작업을 완료하면 마지막 두 요소가 서로 정확히 일치하는 올바른 배열로 끝나고 소멸자를 사용하여 마지막 요소를 정리합니다.

참고 :이의 성능은 아마 C++ 대신에 표준의 11 이동 의미 :: 사본

비고 2 (부스트 이동 알고리즘 boost::move 등)을 고려 개선 될 수있다 : 당신이의 요소에 대한 포인터를 누르고 있으면 위치> 색인에 나열하면이 정렬이 변경된 후 잘못된 요소를 가리 킵니다.

+0

흠 ... 그래서 소멸자는 함수에서 지우도록 선택한 인덱스에서 요소를 돌보는 중입니까? 왜냐하면 dynArr [- listSize]를 읽을 때 dynArr [- listSize]에서 요소를 파기한다고 생각하게 만듭니다. 그러나 이는 함수에 인자로 넣은 인덱스에서 요소를 파기하는 것과 같지 않습니다. 소멸자가 먼저 요소를 파괴해야합니까? 그런 다음 사본을 사용하여 한 위치 왼쪽으로 요소를 이동시키지 않습니까[email protected] – FrostyStraw

+0

색인에서 요소가 아닌 마지막 요소를 "destorying"할 때 코드가 올바른 이유를 이해하려면 EDIT를 참조하십시오. 그러나 누군가가 ArrayList의 요소에 대한 포인터를 보유하고 있다면이 변경 후에 잘못된 요소가됩니다 – odedsh

관련 문제