지금 프로젝트에서 STL의 vector와 map을 써보고 있습니다. 제가 링크드 리스트를 만들어 사용하다가
트리 형태의 복잡한 구조로 해야 하는 부분에서 STL로 전향했습니다;;(머리 아포..;;)
잘 집어넣고 잘 빼쓰고 했는데요. 그 안에 잇는 것들을 삭제하려는데서 의문점이 생겼습니다.
vector안에 동적할당한 구조체 포인터가 들어가구요. 그 구조체 안에는 또 vector가 있습니다.
이 vertor는 동적할당한 다른 구조체 포인터가 들어갑니다. 왜 이렇게 복잡하게 하셨어요~? 라고 물으신다면
상황이 그렇게 밖에 해결방법이 안 떠올랐습니다 ㅠ.ㅠ
vector나 map에 insert하면 제 생각이 맞다면 내부적으로 동적할당하여 제가 삽입하고자 하는 데이터가 들어가는 것
같습니다. vertor나 map의 멤버함수를 보면 erase(), clear()라는게 있습니다.
여기서 제가 궁금한 것은 저 함수들이 자기가 보관하고 있는 데이터들(제가 동적할당한 데이터..)에 대해서도 메모리
해제를 해주는가 입니다.
고수님들의 답변 부탁드릴게요^^ 좋은 하루 시작하세요~
Foo* pFoo = new Foo();
fooList.push_back(pFoo);
이런식으로 하셨다면, 반드시 아래와 같이 fooList를 한번 돌리면서 요소들을 delete 해줘야합니다
for(int i =0; i < fooList.size(); ++i)
{ delete fooList[i]; }
그리고 포인터에 대해서 많이들 헷갈리시는 거 같은데, 주소 위치를 가지고 있을 뿐이지 포인터 자체도 하드웨어 스펙에 따른 사이즈를 가지는 정수값입니다.
만약 32비트 컴퓨터라면 32비트 == 4바이트 정수 변수이고, 64비트 컴퓨터라면 64비트 == 8바이트 정수 변수입니다.
당연히 위에처럼 넣으면, fooList는 다르게 보면 그냥 int 배열일 뿐입니다. 그리고 그 int 들은 push_back 할 때 새로 할당되어 들어갑니다.
(벡터는 연속메모리값을 쓰기 때문에 거의 배열에 가까워서 약간 작용이 특이하지만, 일단 STL 일반적인 느낌으로 이야기하겠습니다.)
그 int변수(포인터)들은 모두 벡터 등의 STL컨테이너가 알아서 해제해줍니다. 그러나 그 포인터들의 값에 들어있는 주소에 있는 객체들은 당연히 벡터와는 전혀 관계가 없죠.
벡터는 그 객체들이 담고있는 내용에는 하등의 관심이 없습니다. 그러니 직접 삭제해줘야합니다.