2013. 4. 29. 16:37

* 실제로 포인터를 사용하는 경우들

  - 동적으로 할당된 메모리를 사용하는 경우 ( p = new listNode())

  - 함수의 매개 변수로 변수의 주소를 전달하는 경우

  - 클래스의 멤버변수나 멤버함수를 호출하는 경우

 

1. 동적 메모리와 정적메모리의 차이는?

< 정적 메모리 할당 >

  - 프로그램이 시작되기 전에 미리 정해진 크기의 메모리를 할당 받는 것

      -> 메모리의 크기가 프로그램이 시작하기 전에 결정

      -> 프로그램의 수행 도중에 그 크기는 변경될 수 없다.

 

int i, j;

int buf[80];

char name[] = "hello world";

장점 : 간단하게 메모리 할당

단점 :  입력의 크기를 미리알 수 없는 경우 -> 더 큰 입력이 들어온다면 처리 못함

                                                          -> 더 작은 입력이 들어온다면 남은 메모리 공간 낭비

 

< 동적 메모리 할당(dynamic memory allocation) >

- 실행 도중에 동적으로 메모리를 할당받는 것

- 필요한 만큼의 메모리를 시스템으로 할당(new)  받아서 사용이 끝나면 시스템에 메모리 반납(delete)

 

 

2. 동적 메모리 위치

 - 힙(heap)

 - 힙이란 ? : 코드공간/ 전역공간/ 스택을 제외하고 남은 메모리 영역

 - 힙 장점? : 히프 할당받으면 함수가 종료되더라도 메모리 공간이 없어지지 않음!

                  but!!! 히프에서 할당받은 공간은 반드시 반납하여야 한다. :)

                  => 반납하지 않고 계속 할당만 받으면 시스템이 정지할 수 있음!

* C++에서 메모리의 구분

# 코드공간(code space) : 코드 공간에는 프로그램 코드가 저장된다.

# 전역공간(global namespace) : 전역 공간에는 전역 변수들이 생성된다.

#스택(stack)

  - 스택은 프로그램이 실행하면서 사용하는 공간

  - 주로 함수 호출 시 함수 매개 변수 / 함수의 지역변수를 생성하는 공간

  - 함수호출 후 자동적 소멸

#힙(heap)

 

3. 동적 메모리 반납이 필요한 이유

  동적 할당된 메모리는 자동적으로 반납되지 않는다!

따라서 할당된 메모리를 가리키는 포인터를 항상 가지고 있다가 메모리가 더 이상 필요 없으면 delete를 사용하여 시스템에 반납하여야 한다!!

if, 동적 할당된 메모리를 반납하지 않고 포인터를 없애버리면 메모리를 반납할 방법이 없다.

-> 따라서 메모리를 프로그램이 종료되기 전까지 할당된 상태로 남아있다!

이상태를 ? 메모리 누수(memory leak)!

  ==> 반복적으로 메모리 누수가 일어나면 최종적으로 메모리 부족 현상초래!

 

 

 

 

출처 : POWER C++ / 천인국 저

 

 

 

Posted by Triany