일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 메타테이블
- 영화
- 반복자
- lua
- 함수 객체
- effective stl
- UE4
- implicit conversion
- 암시적 변환
- reference
- Effective c++
- 루아
- virtual function
- 스마트 포인터
- resource management class
- c++
- more effective c++
- 게임
- 다형성
- 오블완
- 언리얼
- operator new
- exception
- 상속
- 비교 함수 객체
- 티스토리챌린지
- 참조자
- 영화 리뷰
- Smart Pointer
- 예외
Archives
- Today
- Total
스토리텔링 개발자
[C++] 벡터 반복자 사용 중 수정 오류(Modify Vector Iterating) 본문
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