본문 바로가기

C++

Chapter 2. C++의 메모리 동적 할당

Chapter 2. C++의 메모리 동적 할당
1. 메모리(Memory)
 - 메모리
  ‧ 프로그램이 실행되는 동안 데이터가 저장되는 공간
  ‧ 운영체제에 의해 할당되는 메모리 공간

  ◦ 코드(Code) 영역 : 실행할 프로그램의 코드가 저장되는 공간으로 CPU는 코드영역에 저장된 명령문을 하나씩 꺼내 실행한다.
  ◦ 데이터(Data) 영역 : 전역변수와 static변수가 할당되는 영역으로 프로그램 시작과 동시에 할당되어 종료 시까지 남아있는 특징의 변수가 저장되는 공간이다.

  ◦ 힙(Heap) 영역 : 프로그래머가 원하는 시점에 메모리 공간에 할당 및 소멸을 하기 위한 공간이다.
  ◦ 스택(stack) 영역 : 지역변수와 매개변수가 할당 되는 공간으로 함수를 빠져나가면 소멸되는 변수를 저장하는 공간이다.
 - 메모리의 종류
  ‧ 정적 메모리
  ◦ 메모리가 언제 할당되고 해제 될지, 얼마나 할당될지 컴파일 시간에 결정되는 메모리
  ◦ 스택(stack) 영역과 데이터(Data) 영역에 할당되는 메모리
  ‧ 동적 메모리
  ◦ 메모리가 언제 할당되고 해제 될지, 얼마나 할당될지 실행 시간에 결정되는 메모리
  ◦ 힙(Heap) 영역에 할당되는 메모리
  ◦ C언어 에서는 melloc 함수와 free 함수를 이용하지만 C++에서는 조금 더 간편하고 간소화되어 함수가 아닌 연산자로 new 연산자와 delete 연산자를 사용한다.

  ‧ new 연산자

 변수 동적 할당
 포인터 = new 데이터형;

 배열 동적 할당
 포인터 = new 데이터형[크기];

  ◦ C++에서는 동적 메모리를 할당하는 C언어에서의 malloc과 같은 기능을 하는 new라는 연산자가 새로 생겼다.
  ◦ 함수가 아닌 연산자로 malloc 함수보다 사용하기 간편하며 형 변환을 하지 않아도 된다.
  ◦ new 연산자를 이용해 생성자를 호출할 수 있다.
    ※ 생성자 :  생성자는 클래스로부터 객체가 생성될 때 초기화 과정을 수행하는 함수이다.
  ‧ delete 연산자

 변수 동적 할당 해제
 delete 포인터;

 배열 동적 할당 해제
 delete[] 포인터;

  ◦ C언어에서 free의 기능과 같은 역할을 하는 연산자이다.
  ◦ 함수가 아닌 연산자로 free 함수보다 사용하기 간편하다
  ◦ 대괄호([])의 위치가 바뀌면 컴파일에러가 발생한다.
  ‧ 문자열 동적 할당
  ◦ 문자열의 길이가 일정하지 않은 데이터를 여러 개 저장할 때 사용하며 이와 같은 많은 데이터를 처리할 때 메모리를 효율적으로 사용할 수 있다는 장점이 있다.

  ◦ 문자열의 길이가 일정하거나 저장 데이터의 개수가 적다면 배열을 사용하는 것이 간편하다.

 

2. 기억클래스
 - 변수는 데이터형과 기억클래스를 가지고 있다.
 - 데이터형(Data Type) : 변수의 크기와 어떤 타입의 데이터를 처리할 것인가를 결정한다.
 - 기억클래스(Storage Class) : 변수가 메모리상에서 사용되는 유효범위와 초기화 방법을 결정한다.
 - 변수는 기억클래스에 따라 지역변수, 전역변수, 정적변수로 나뉜다.
 - 지역 변수
  · 함수나 블록({}) 내에서 선언된 변수로 선언된 함수나 블록 내에서만 사용할 수 있다.
  · 함수가 종료되면 메모리상에서 소멸된다.
  · 매개변수도 지역변수에 포함된다.
  · 초기화하지 않으면 쓰레기 값을 갖는다.
 - 전역 변수
  · 함수 외부에서 선언된 변수로 모든 함수에서 사용 할 수 있다.
  · 프로그램의 시작과 동시에 메모리 공간에 할당되며 종료 시까지 존재한다.
  · 별도의 값으로 초기화하지 않으면 0으로 초기화된다.
 - 정적 변수
  · static을 붙여 선언된 변수를 말하고 선언 위치에 따라 지역 변수 또는 전역 변수의 특징을 가질 수 있다.
  · 정적 지역 변수 : 선언된 함수 안에서만 사용할 수 있다.
  · 정적 전역 변수 : 프로그램 실행 시 메모리가 단 한번 할당되며 프로그램이 종료되면 메모리에서 소멸된다.