반복자 무효화란?
반복자가 가리킨 대상을 erase 하여 삭제하였을 때. 일어나는 문제 현상을 말한다.

예시 )
iterator i;
m_object.erase(i);

반복자 무효화 현상을 설명하자면 다음과 같다.

반복자는 포인터를 포함한 객체에 불과하므로 본질적으로는 포인터의 기능을 수행한다.
문제를 단순하게 접근하여, 포인터가 특정 메모리의 요소중 하나를 가리키고 있다가.. 해당 메모리에서 그 요소가 삭제되면?.. 

연결 리스트의 노드 구조를 생각해보자. 노드 구조는 하나의 노드가 다른 노드로 연결 될 수 있는 길 (포인터)을 가지고 있었는데.. 그게 날아가버렸다면?

그것을 따라 길을 타고다니던 반복자의 입장에서는 다음으로 어딜 가야할 지 알 수 없다.


그럼 배열과 같은 연속적인 메모리 구조를 생각해보자.

memcpy의 문제를 생각하면 데이터를 원본 안에서 다루는 구조일 것이라고는 도저히 생각되지 않는다. 그렇다면 데이터는 경우에 따라 얼마든지 이동할 것이고.. 이 때 해제되어 폐허만 남았을 메모리를 가리키는 반복자는 또 바보가 된다.


따라서 반복자는 

iterator i;
m_object.erase(i++);

이처럼 삭제할 대상을 삭제한 후, 자신의 자리를 새로 잡아주어야한다. 이 경우 날아가게 될 데이터를 전달한 후에 자신은 그 다음이라는 곳으로 이동하기 때문에 문제가 생기지 않는다.



Posted by GENESIS8

댓글을 달아 주세요