백터 사용 시 실수 할 수 있는 문제입니다.

 

아래 코드에서 어떤 문제점이 있나 한번 보실래요?

 

#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();

 

 

비단 벡터 뿐만 아니라 포인터를 다루면서 종종 실수 할 수 있는 경우인데요,

 

기본 변수 타입의 포인터는 익숙해서 실수를 잘 안 할 수 있는데, 벡터등 컨터이너에 포인터를 붙일 때 . 찍고 컴파일 오류가 없기 때문에 그냥 지나칠 수 있을 것 같습니다.

 

저도 좀전에 실수 해서 생각 나는 김에 여기에 샘플코드와 함께 적어봤습니다. 

 

 

코딩량이 많고 빨리빨리 작업하다보면 빌드가 정상적으로 되는 것을 보고 그냥 지나칠 수 있는데요,

 

잘못하다간 나중에 로직에러 / 데이터 검증에 디버깅 할때는 더 많은 수고가 들지도 모르겠죠..;;

 

포인터를 다룰 때는 함수의 전달과 사용되는 부분들을 꼼꼼히 훑어 보고 다음 코드로 넘어가는 습관과 펑션을 짜고 나서 데이터 전달. 연산에 대한 테스팅을 한번씩 해보고 다음 단계로 넘어가는 습관이 중요할 것 같습니다.

 

 

+ Recent posts