c++ 에서 map의 iterator를 사용하다가 'Cannot dereference end list iterator' 오류를 맞닥뜨렸다.
코드만 보았을 때에는 괜찮아 보였는데,,
원인은 map의 find() 함수 리턴값이 iterator 였다는 점에서 시작한다.
find() 함수는 map 내에서 찾고자 하는 값이 없을 경우 map::end() 를 리턴하는데,
이 end()에 접근해서 데이터를 읽으려고 하면 에러가 발생하기 때문이다.
아래 코드의 1번 시나리오처럼 map에 있는 값에 접근하면
iter->second 에도 정상적으로 접근하여 값을 얻어온다.
iter가 map의 end()를 가리키지 않기 때문이다.
반면, 2번 시나리오처럼 map에 없는 값에 접근하면
iter는 map내에 찾는 데이터가 없다는 의미로 end()를 저장하게 된다.
이 때 iter->second 는 end()->second 를 접근하려 하기 때문에 에러가 발생한다.
end()는 유효하지 않은 데이터이기 때문이다.
using namespace std;
#include <iostream>
#include <unordered_map>
int main() {
// map 생성
unordered_map<int, int> my_map;
// map 데이터 생성
for (int i = 0; i < 100; i++) {
my_map.insert(make_pair(i, i*i));
}
// 1번 시나리오
auto iter = my_map.find(1); // 있는 값을 참조
bool is_end = (iter == my_map.end());
int val = iter->second;
cout << boolalpha << "is_end: " << is_end << " / key: "
<< iter->first << " / value: " << val << std::endl;
// 2번 시나리오
iter = my_map.find(100); // 없는 값을 참조
is_end = (iter == my_map.end());
val = iter->second; // Exception !!!
cout << boolalpha << "is_end: " << is_end << " / key: "
<< iter->first << " / value: " << val << std::endl;
}
반응형
'Development Experience > C, C++' 카테고리의 다른 글
LNK2019 에러와 네임 맹글링, 그리고 extern (0) | 2021.03.18 |
---|---|
C++ unique_ptr 의 deleter (0) | 2020.12.16 |
c++ std::function 과 std::bind, C2893 Error (0) | 2020.12.15 |
C++ 다른 프로젝트에 있는 파일 참조하기 (0) | 2020.12.15 |
C++ 스마트 포인터 간단 정리 (0) | 2020.12.09 |