컨테이너 원소에 접근하려고 반복자를 사용하고 싶다면 문자열을 출력하는 코드는 다음과 같이 작성해야 한다.
for (auto iter = std::begin(words); iter != std::end(words); ++iter) std::cout << **iter << ” “; std::cout << std::endl;
iter는 반복자이고, iter가 가리키는 원소에 접근하려면 반드시 역참조를 해야 한다. 원소도 포인터라서 string 객체를 얻으려면 이것도 역참조를 해야 한다. 따라서 string 객체를 얻는 표현식은 **iter가 된다.
포인터 원소를 삭제할 때는 자유 공간에 있는 메모리를 먼저 해제해야 하고, 이를 직접 관리해야 한다. 자유 공간에 있는 메모리를 해제하지 않고 포인터를 삭제하면 메모리를 해제할 수 없게 된다. 이게 컨테이너에 원시 포인터를 저장했을 때 흔히 발생하는 메모리 누수 유형이다. 다음은 words 벡터에서 메모리 누수가 발생하는 코드다.
for (auto iter = std::begin(words); iter != std::end(words) ; ) { if (**iter == “one”) words.erase(iter); // 메모리 누수! else ++iter; }