[C++] 2. const, 메모리영역, new/delete

2011. 5. 20. 10:03C++


C++ 기초2

1. const 키워드
   변수를 상수화 시키는 키워드 입니다.

 - const int n = 10;  // n 이라는 value값 자체를 변경불가
 - const int* n;      // 데이터 상수화, n의 주소값이 가리키는 value값 변경 불가, *n=20 (x)
 - int* const n;      // 포인터 상수화, n의 주소값 변경 불가
 - const int* const n; // n의 value와 주소값 모두 변경 불가

2. 메모리 구분
 프로그램을 컴파일 하고 실행하면 메모리 공간이 잡히게 됩니다.

 - 데이터 영역: 전역변수, Static 변수  (프로그램이 종료될때까지 메모리에 존재)

 - 힙 영역: 런타임에 크기가 결정될수 있는것들을 올리기 위한 공간
            프로그래머가 메모리 할당과 해제를 담당합니다.

       int size; => 요건  Stack  영역에 할당
       cin>>size;
       function(size);
      
       void function(int size){
            int array[size]; // 이공간은 어떤 Size가 올지 모르기 때문에 Heap에 할당된다.
       }



 - 스택 영역: 컴파일 타임에 크기가 결정, 지역변수, 매개변수

4. malloc & free
 malloc : 힙공간에 메모리 할당
 free : 할당된 메모리 해제

 char* name;
 name=(char*)malloc(sizeof(char)*11); //11 바이트 필요함, 메모리 할당
 strcpy(name, "안녕하세요");
 printf("name : %s\n"), name);
 free(name); // 할당한 메모리 해제

5. bool 기본 자료형
 true & false 는 1과 0이 아니라 논리적인 참과 거짓을 의미하는 키워드 입니다.
 int로 데이터 변환시 1과 0이 됩니다.


6. 레퍼런스
 * 변수란 메모리 공간에 붙여진 이름
 * 레퍼런스란 메모리 공간에 이름을 하나더 추가하는 행위

 c++ 부터는 메모리 공간에 1개 이상의 이름을 붙여 줄수 있습니다.

 int value = 10;

 int *pVal = &val; // value의 주소값을 저장한다.
 int &refVal = val; // 이제 refVal은 value 의 값을 가리킨다.

  -----------------------
  - & 키워드: 주소값 연산자 뿐만 아니라 레퍼런스 연산자로도 사용됩니다.
    int &refVal : 선언할때는 레퍼런스 연산자로 사용
    &refVal : 이렇게 사용할때는 refVal의 주소값을 말합니다.

    int* val : val을 포인터 주소로 사용한다.
    *val : val 이 가리키는 메모리 공간의 값을 말한다.

  -----------------------
  * 제약사항
  - 레퍼런스는 생성과 동시에 초기화 되지 않으면 안된다. 상수 할당 할수 없다.
    int &ref; (x)
    int &ref = val; (0)
    int &ref=10; (x)

  -----------------------
  swap(int* a, int *b) 와 swap(int& a, int& b)
  => 포인터를 이용한 CallBy 레퍼런스와 레퍼런스를 이용한 CallBy 레퍼런스
  => 잘못된 포인터 연산을 통한 위험성이 존재하기때문에 되도록 레퍼런스를 이용하도록 한다.
     예> int* a;
         a++; // 여기와 같이 a가 가리키는 곳의 값을 증가시키는게 아니라
                 주소값을 증가시키는 오류를 범할수 있기 때문이다.( 여기서는 int형 이므로 4byte 뒤로 이동된다.)
  => 레퍼런스로 전해줄경우 해당 값이 함수내에서 변경 못하게는 못하는가?
     이때는 const 를 이용하면 됩니다.
     swap(const int& a, const int& b)


7. new 와 delete
 - 메모리 할당의 변화를 숙지합니다.
 - new 연산자 : 메모리 할당 실패시 NULL 포인터를 리턴합니다.
                따라서 if(arr==NULL) 일경우 메모리 할당이 실패한것입니다.

 // 신규 방식
 int* val = new int; // Heap에 메모리 할당
 int* arr = new int[size]; // Heap에 메모리 할당
 delete val;
 delete []arr;

  // 이전 방식
 int* val = (int*)malloc(sizeof(int));
 int* arr = (int*)malloc(sizeof(int)*size);
 free(val);
 free(arr);

참고) 범하기 쉬운 오류
        char* name = new char; //  new char[20]; 이라고 해야겠죠? 
                                           // hello를 받을수 있는 만큼의 영역을 확보해야하니까요.
        strcpy(name,"hello");
        delete name;
        위의 내용은 컴파일은 잘되지만 실행시 delete에서 먹통이 된다. char문자열 포인터를 잘못 지정했기 때문이다. 선언과 사용이 모두 틀린상태로 delete하게되어 free 시킬 영역을 찾지 못해 나오는 현상입니다.