관리 메뉴

KorSA

iterator 쓸 때 주의 사항 (feat. Cannot dereference end list iterator) 본문

Development Experience/C, C++

iterator 쓸 때 주의 사항 (feat. Cannot dereference end list iterator)

Praiv. 2023. 7. 5. 18:41
320x100

 

 

 

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;
}
728x90
728x90
Comments