remove와 비슷한 알고리즘을 포인터의 컨테이너에 적용할 때에는 각별히 조심하자.

EffectiveSTL32에서 언급한 것처럼 remove(remove_if, unique)는 지워질 데이터에 대해서 지워 지지 않는 데이타로 덮어써 버리는 동작을 취한다. 이런 동작은 컨테이너의 요소타입이 포인터일 경우 심각한 메모리 누수 현상을 일으킬 가능성이 있다.

이 경우 partition 알고리즘으로 지워질 대상이 되는것과 남아있을 데이타를 분리한뒤 지워질 대상의 메모리를 해제하고 erase 를 호출하면 깔끔하다.

하지만 부득이한 사정으로 remove 류의 함수만을 사용해야 한다면 for_each 등으로 직접 컨테이너의 요소중 삭제될 데이타의 메모리를 해제해 준뒤 remove-erase 합성문을 호출해 주어야 한다.

이런 것을 신경 쓰고 싶지 않다면 스마트 포인터를 사용하도록 하자!

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다