다음을 통해 공유


CObject 컬렉션의 모든 개체 삭제

이 문서에서는 컬렉션 개체 자체를 삭제하지 않고 컬렉션의 모든 개체를 삭제하는 방법을 설명합니다.

컬렉션의 CObject모든 개체(또는 파생된 개체)를 삭제하려면 컬렉션의 모든 구성원에 액세스하는 문서에 설명된 CObject반복 기술 중 하나를 사용하여 각 개체를 차례로 삭제합니다.

주의

컬렉션의 개체를 공유할 수 있습니다. 즉, 컬렉션은 개체에 대한 포인터를 유지하지만 프로그램의 다른 부분에도 동일한 개체에 대한 포인터가 있을 수 있습니다. 모든 파트가 개체 사용을 완료할 때까지 공유되는 개체를 삭제하지 않도록 주의해야 합니다.

이 문서에서는 다음에서 개체를 삭제하는 방법을 보여줍니다.

CObject에 대한 포인터 목록의 모든 개체를 삭제하려면

  1. GetNext 목록을 사용하고 GetHeadPosition 반복합니다.

  2. 연산자를 delete 사용하여 반복에서 발견된 각 개체를 삭제합니다.

  3. RemoveAll 해당 요소와 연결된 개체가 삭제된 후 목록에서 모든 요소를 제거하려면 함수를 호출합니다.

다음 예제에서는 개체 목록에서 CPerson 모든 개체를 삭제하는 방법을 보여줍니다. 목록의 각 개체는 원래 힙에 CPerson 할당된 개체에 대한 포인터입니다.

CTypedPtrList<CObList, CPerson*> myList;
CPerson* pPerson = new CPerson();
myList.AddHead(pPerson);
POSITION pos = myList.GetHeadPosition();

while (pos != NULL)
{
   delete myList.GetNext(pos);
}
myList.RemoveAll();

마지막 함수 호출 RemoveAll은 목록에서 모든 요소를 제거하는 목록 멤버 함수입니다. 멤버 함수 RemoveAt 는 단일 요소를 제거합니다.

요소의 개체 삭제와 요소 자체 제거의 차이점을 확인합니다. 목록에서 요소를 제거하면 개체에 대한 목록의 참조만 제거됩니다. 개체는 여전히 메모리에 있습니다. 개체를 삭제하면 개체가 더 이상 존재하지 않으며 해당 메모리가 회수됩니다. 따라서 목록이 더 이상 존재하지 않는 개체에 액세스하지 않도록 요소의 개체가 삭제된 직후 요소를 제거하는 것이 중요합니다.

배열의 모든 요소를 삭제하려면

  1. 배열을 반복하려면 인덱스 값을 사용하고 GetSize 정수로 지정합니다.

  2. 연산자를 delete 사용하여 반복에서 발생한 각 요소를 삭제합니다.

  3. 함수를 RemoveAll 호출하여 삭제된 후 배열에서 모든 요소를 제거합니다.

    배열의 모든 요소를 삭제하는 코드는 다음과 같습니다.

    CArray<CPerson*, CPerson*> myArray;
    
    int i = 0;
    while (i < myArray.GetSize())
    {
       delete myArray.GetAt(i++);
    }
    
    myArray.RemoveAll();
    

위의 목록 예제와 마찬가지로 배열의 모든 요소를 제거하거나 RemoveAt 개별 요소를 제거하도록 호출 RemoveAll 할 수 있습니다.

맵의 모든 요소를 삭제하려면

  1. GetNextAssoc 배열을 사용하고 GetStartPosition 반복합니다.

  2. 연산자를 delete 사용하여 반복 시 발생하는 각 맵 요소의 키 및/또는 값을 삭제합니다.

  3. 함수를 RemoveAll 호출하여 삭제된 후 맵에서 모든 요소를 제거합니다.

    컬렉션의 CMap 모든 요소를 삭제하는 코드는 다음과 같습니다. 맵의 각 요소에는 문자열이 키로, CPerson 개체(파생 CObject)가 값으로 포함됩니다.

    CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap;
    // ... Add some key-value elements ...
    // Now delete the elements
    POSITION pos = myMap.GetStartPosition();
    while (pos != NULL)
    {
       CPerson* pPerson;
       CString string;
       // Gets key (string) and value (pPerson)
       myMap.GetNextAssoc(pos, string, pPerson);
       delete pPerson;
    }
    // RemoveAll deletes the keys
    myMap.RemoveAll();
    

맵의 모든 요소를 제거하거나 RemoveKey 지정된 키를 사용하여 개별 요소를 제거하도록 호출 RemoveAll 할 수 있습니다.

참고 항목

컬렉션의 모든 멤버에 액세스