더북(TheBook)

컨테이너 원소에 접근하려고 반복자를 사용하고 싶다면 문자열을 출력하는 코드는 다음과 같이 작성해야 한다.

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;
}
 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.