2008. 11. 13. 11:45

메모리(힙과 스텍, 데이터영역)의 이해

스텍(STACK)메모리 : 변수, OS에서 관리,
힙(HEAP)메모리 : 프로그래머가 관리, 해제하지 않을 경우 문제발생   

프로그램을 실행하면 운영체제는 메모리를 할당한다. 단순히 메모리공간 하나만 떡 하니 제공하는것이 아니라 적절하고 효율적이며 용도에 맞게 메모리공간을 나누어 놓았다.

데이터 영역

전역변수, static 변수를 위한 공간이다. 이 두 변수는 프로그램이 실행되자마자 데이터 영역의 메모리를 차지하며 프로그램이 종료될때야 비로소 메모리에서 해제된다. 전역변수는 말그대로 함수 외부에 선언하는 변수이고 static 변수는 시작부터 0으로 초기화되며 데이터가 누적되는 변수이다. 일반적으로 static변수에 관한 오해가 있을거 같아 잠깐 그 부분에관해 설명좀 해볼까함 ㅋㅋ

#include<iostream>

void start(void){
    static int lee;
}

int main(){
    start();

    return 0;
}

lee 변수는 언제 메모리를 치자힐까?? 대다수의 사람들은 메인함수에서 start함수를 호출하고 나서 메모리를 차지한다고 생각할지도 모른다. 하지만 절대 그렇지않다. 전역변수나 static변수는 위에서 언급했듯이 프로그램이 실행되자마자 데이터 영역의 메모리를 차지한다. 그렇다면 저 static int lee는 무슨의미일까? 바로 0으로 초기화 하기위한 작업이다. 일반적으로 변수를 선언하면 auto변수라해서 초기화되지않은쓰레기값이 들어가지만 static을 붙이면 0으로 초기화한다.


스텍 영역
컴파일타임 즉, 번역시간에 메모리공간을 차지하는 영역이다. 함수에 접근해서 읽어낸 변수는 대부분 스텍영역에 메모리를 배정받는다. 블록구조의 규칙을 엄격히 여겨 한 블록내에서 선언된 변수는 그 블록이 끝날때 메모리가 해제된다.

#include<iostream>
int main(){
    int lee;
    return 0;
}

짧지만 강력한 예제 ㅋㅋㅋㅋ;;
lee변수는 컴파일과 동시에 4바이트의 메모리공간을 차지할것이다. 10번을 하던 100번을 하던 같은 크기의 메모리 공간을 차지한다.


힙 영역
실행시간에 메모리공간을 차지하는 영역이다. 사용자가 직접 메모리를 할당해야하며 해제또한 사용자가 직접 해줘야한다.

#include<iostream>

using std::cin;

void get(int i=0);


int main(){
    int size;
    cin>>size;
    get(size);
    return 0;
}

void get(int i){
    int array[i];
}


int array[i]이런식의 변수선언은 스텍에 할당하라는 명령과 같다. 사용자의 입력을 통해서 배열의 크기가 조절될수있기때문이다. 분명 이 조건에 따른다면 힙에 메모리가 할당되야한다. 하지만 이 소스는 100% 컴파일 에러가 난다. 이런식으로 힙영역에 메모리를 차지할수 없기때문이다. 그렇기 때문에 malloc또는 new 연산자가 있는것이다.

#include<iostream>

using std::cin;
using std::cout;
using std::endl;

void get_put(int i=0);

int main(){
    int size;
    cout<<"할당할 크기의 숫자를 입력하세요"<<endl;
    cin>>size;
    cin.get();
    get_put(size);
    return 0;
}

void get_put(int i){
    int * array = new int[i];
    cout<<i*4<<"만큼의 바이트가 확보되었습니다."<<endl
        <<"아무키나 누르면 메모리를 해제합니다"<<endl;
    cin.get();
    delete [] array;
    cout<<"메모리가 해제되었습니다"<<endl;
}


위 소스야말로 정말 올바른 소스가 되겠다.  

'C# .NET' 카테고리의 다른 글

깡통 개발자의 C# 익히기 -제 1강- (C#의 특징)  (0) 2008.11.14
메모리 관리와 동적 할당.. C  (0) 2008.11.13
클래스 기초 & 속성  (0) 2008.11.07
클래스 기초 & 메서드  (0) 2008.11.07
클래스 기초 & 필드  (0) 2008.11.07