더북(TheBook)

포인터를 삭제하지만, 포인터가 가리키는 메모리는 해제하지 않아서 메모리 누수가 발생한 것이다. 원시 포인터를 저장한 원소를 삭제할 때는 메모리를 먼저 해제해야 한다.

for (auto iter = std::begin(words); iter != std::end(words) ; )
{
  if (**iter == “one”)
  {
    delete *iter;             // 메모리를 해제한다…
    words.erase(iter);        // …그리고 포인터를 삭제한다
  }
  else
    ++iter;
}

vector를 제거하기 전에 자유 공간에서 string 객체를 모두 삭제해야 한다는 걸 잊지 말자. 다음과 같은 순서로 삭제해야 한다.

for (auto& w : words)
  delete w;            // 가리키고 있는 string을 삭제
words.clear();         // vector에서 모든 원소를 삭제

인덱스를 사용해 포인터에 접근한다면 간단히 delete 연산자를 사용해 string 객체를 삭제하면 된다. 루프가 끝나면 vector에 있는 모든 원소는 잘못된(invalid) 포인터가 된다. 따라서 vector를 이런 상태로 남겨두지 않는 게 중요하다. clear()를 호출해서 모든 원소를 제거한 다음에 vector에서 size()를 호출하면 0을 반환할 것이다. 물론, 반복자를 사용한다면 다음과 같이 작성하면 된다.

for (auto iter = std::begin(words); iter != std::end(words); ++iter)
  delete *iter;
 

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