스토리텔링 개발자

[C++] 벡터 반복자 사용 중 수정 오류(Modify Vector Iterating) 본문

개발/C++

[C++] 벡터 반복자 사용 중 수정 오류(Modify Vector Iterating)

김디트 2021. 10. 21. 18:40
728x90

개요

벡터 반복자를 사용해서 순회 중 새 요소를 추가하는 순간 크래시가 발생했습니다.

컴파일러 특성에 따라 다를 수도 있겠지만, 컴파일러의 특성에 기반한 코드는 위험하니 이 용법은 문제가 있다고 봐도 무방합니다.

 

어떤 점이 문제였을까요.

 

 

 

문제 파악

이해를 돕기 위해 코드를 첨부합니다.

vector<int> test;
test.push_back(1);
test.push_back(1);
test.push_back(1);
  
for(auto it = test.begin() ; it != test.end() ; ++it)
{
    test.push_back(1);
}

 

마지막에 요소가 추가되었으므로 반복자는 문제 없이 계속 루프를 돌면 되지 않았을까요?

 

이 코드의 문제는 벡터가 일정 크기의 메모리를 미리 마련해둔다는 점입니다.

일반적인 컴파일러는 메모리가 필요할 때마다 2배수로 크기를 확장하는데요.

이 경우엔 메모리가 더 필요해져서 이동 시멘틱으로 기존 벡터 요소들을 다른 메모리로 이동시켰습니다.

 

기존 요소들의 메모리 위치가 바뀌었으므로 이 경우 기존에 순회하고 있던 반복자는 더 이상 유효하지 않게 됩니다.

또한 메모리가 실제로 변경되지 않았더라도 그 상황을 방지하는 차원에서 반복자 내부에서는 벡터 요소를 추가할 수 없게 한 것이겠죠.

 

 

 

결론

결론적으로 반복자 순회 중에는 벡터를 수정하지 않는 것이 안전합니다.

만약 순회 중 컨테이너에 요소를 추가 및 삭제하려면 다른 전통적인 방식을 사용해야겠습니다.

728x90
Comments