백터 사용 시 실수 할 수 있는 문제입니다.
아래 코드에서 어떤 문제점이 있나 한번 보실래요?
#include "stdafx.h"
#include <string>
#include <vector>
using namespace std;
int fn1(vector<string> *pvt) {
int totallen = 0;
for (int i = 0; i < pvt->size(); i++) {
totallen += pvt[i].size();
}
return totallen;
}
int main()
{
vector<string> vtDumy;
vtDumy.push_back("hello");
vtDumy.push_back("my");
vtDumy.push_back("name");
vtDumy.push_back("is");
vtDumy.push_back("ososoi!");
int totallen = fn1(&vtDumy);
printf("total len=%d\n", totallen);
getchar();
return 0;
}
위 코드를 가지고 visual studio 에서 빌드하면 정상적으로 빌드가 되고 실행도 됩니다.
우리가 예상한 결과값은 "hellomynameisososoi!" 총 20자 입니다.
하지만 실행하게 되면
결과를 말씀드리면 아래코드에서 문제가 있습니다.
totallen _= pvt[i].size();
여기서 pvt는 백터의 포인터이기 때문에 실제 우리가 원하는 백터의 n번째 원소(string)의 길이를 얻기위해서는
totallen += (*pvt)[i].size();
더 명시적으로 표현하자면 아래와 같습니다.
totallen += (*(vector<string>*) pvt)[i].size();
비단 벡터 뿐만 아니라 포인터를 다루면서 종종 실수 할 수 있는 경우인데요,
기본 변수 타입의 포인터는 익숙해서 실수를 잘 안 할 수 있는데, 벡터등 컨터이너에 포인터를 붙일 때 . 찍고 컴파일 오류가 없기 때문에 그냥 지나칠 수 있을 것 같습니다.
저도 좀전에 실수 해서 생각 나는 김에 여기에 샘플코드와 함께 적어봤습니다.
코딩량이 많고 빨리빨리 작업하다보면 빌드가 정상적으로 되는 것을 보고 그냥 지나칠 수 있는데요,
잘못하다간 나중에 로직에러 / 데이터 검증에 디버깅 할때는 더 많은 수고가 들지도 모르겠죠..;;
포인터를 다룰 때는 함수의 전달과 사용되는 부분들을 꼼꼼히 훑어 보고 다음 코드로 넘어가는 습관과 펑션을 짜고 나서 데이터 전달. 연산에 대한 테스팅을 한번씩 해보고 다음 단계로 넘어가는 습관이 중요할 것 같습니다.
'까벨로퍼 > 개발 이야기' 카테고리의 다른 글
무료 SSL 인증서 (Let's Encrypt) 생성하기 (3) | 2020.07.15 |
---|---|
[Swift] 설정에서 알림(PUSH) 사용이 켜져있는지 확인하는 방법 (0) | 2020.07.10 |
[C#] 함수 폴딩 단축키 (0) | 2020.07.06 |
[C#] 반복되는 문자를 제거하는 방법 (0) | 2020.07.05 |
[C#] 문자열 다루기 Trim (0) | 2020.07.04 |