반응형
STL size()함수 주의사항
STL에서 제공하는 size()함수의 리턴타입을 찾아보면 아래와 같이 부호가 없는 정수형으로 나와있다.
std::size_t is commonly used for array indexing and loop counting. Programs that use other types, such as unsigned int |
따라서 size()함수를 통해 아래와 같은 코드를 작성하면 문제가 된다.
for (int i=0; i < vt.size() - 1 ; i++)
doSomething();
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
|
#include<vector>
#include<iostream>
using namespace std;
int main(void) {
vector<int> vt;
for (vector<int>::size_type i = 0; i < 10; i++)
vt.push_back(i);
cout << vt.size() << endl;
for (vector<int>::size_type i = 0; i < 10; i++)
vt.pop_back();
cout << vt.size() - 1 << endl;
return 0;
}
|
cs |
위 코드를 실행해보면
10
4294967295
vt.size()-1의 값이 예상치 못한 4294967295로 나왔다.
이는 size()함수의 리턴값의 타입이 부호가 없는 정수형이기 때문에 오버플로우가 발생한 경우이다.
따라서 vt.size()를 사용하기 전에 empty()체크를 하는 로직을 넣거나 하는 등의 로직을 추가해야한다.
반응형
'C and C++' 카테고리의 다른 글
[C++] Template include 오류 해결 방법 (0) | 2020.04.26 |
---|---|
[C++] 순환참조(Circular Dependency) 제거하는 방법 (1) | 2020.04.12 |
[C++] 상속 팁 overide와 final 키워드 (0) | 2019.10.13 |
[C++] 복사 생성자와 복사 대입연산자의 차이점 (2) | 2019.01.13 |
[C++] new 연산자 예외처리 (0) | 2018.12.02 |