2009년 11월 3일 화요일

[c++] 메모리 누수 현상 - new와 Delete 문제

프로젝트 수행하다가.. 메모리 누수 현상이 발생하여서 식겁했는데..

메모리 할당 후 해제에 대한 처리를 제대로 해주지 않아서 발생한 것이었다. -_-;

 

메모리 누수 현상이 발생하는데 원인을 모르겠다, 싶으시면..

혹시 자신이 new 연산자로 메모리를 할당하고나서 delete로 해제를 해 주었는지 확인해보시기 바란다.

 

기본적인 것으로 헤메고 있었던 내 자신이 부끄럽지만..

다음번에도 똑같은 실수를 하지 않기 위해, 다른 이들도 같은 실수를 범하지 않기 위해,

다시 기본을 다지는 의미에서 글을 남긴다!!

 

자, 이제 new 와 delete에 대해서 알아보자!

 

new와 delete는 다들 아시다싶이 메모리를 동적으로 할당 및 소멸하는 역할을 한다.

C에서 malloc과 free 함수를 써 본 경험이 있다면 더 쉽게 이해하실 수 있을 것이다.

 

1. new

int main(void)

{

           int *val = new int;

           int * arr = new int[size];

}

new에서 피연산자는 오른쪽에 작성한다. 이때 할당하고자 하는 데이터의 형태를 작성하면 된다.

 

위 예제에서 ,

 new int는 int형 데이터 하나를 저장할 수 있는 공간을 생성하여 val에게 주소값을 반환한다는 의미이다.

 

malloc과 별 차이 없는데?! 라고 생각하시는 분!!

malloc과 new는 다르다! malloc은 주소 값을 void 포인터형으로 반환하기 때문에 형 변환이 꼭 필요하다.

하지만 new는 자신이 사용하고자 하는 용도에 맞게 포인터를 반환할 수 있다.

이정도면.. 같다고 할 사람은 없을것으로 생각된다.

형변환 해야 하는 것과 하지 않아도 되는 것은 엄청난 차이..는 아니지만 동일하지는 않으니깐..

 

그 다음 줄을 보면 int형 배열로 할당하는 것을 볼 수 있다.

int * arr = new int[size];

역시 할당하고자 하는 데이터의 형태만 선언해 주면 사용이 가능하다.

위의 코드를 해석하자면.. "int형 size 크기의 배열을 할당해서 그 주소를 arr에게 넘겨준다." 가 되겠다.

 

 

2. delete

int main(void)

{

            int *val = new int;

            int *arr = new int[size];

           ............

           delete val;

           delete []arr;

}

delete는 위의 예제처럼 사용하면 된다.

 

할당된 메모리 공간이 배열일 경우에만 포인터 앞에  인덱스 기호([])를 붙여준다는 것을 기억하자!

꼭 기억해야 한다!!

그냥 배열을 delete로 해제하려고 하면 에러난다.ㅋ

 

 

 

new와 delete에 대해서 다시한번 정리해보고 동일한 실수를 하지 않도록 하자!

댓글 없음:

댓글 쓰기