C++

메모리의 동적 할당(dynamic allocation)

Machine_웅 2022. 10. 27. 14:29
728x90
반응형

메모리의 동적 할당(dynamic allocation)

데이터 영역스택 영역에 할당되는 메모리의 크기는 컴파일 타임(compile time)에 미리 결정됩니다.

하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 런 타임(run time)에 사용자가 직접 결정하게 됩니다.

이렇게 런 타임에 메모리를 할당받는 것을 메모리의 동적 할당(dynamic allocation)이라고 합니다.

 

포인터의 가장 큰 목적은 런 타임에 이름 없는 메모리를 할당받아 포인터에 할당하여,

할당받은 메모리에 접근하는 것입니다.

 

C언어에서는 malloc() 함수 등의 라이브러리 함수를 제공하여 이러한 작업을 수행할 수 있게 해줍니다.

C++에서도 C언어의 라이브러리 함수를 사용하여 메모리의 동적 할당 및 해제를 할 수 있습니다.

 

C++에서는 메모리의 동적 할당 및 해제를 위한 더욱 효과적인 방법을 new 연산자와 delete 연산자를 통해 제공합니다.

 


new 연산자

C언어에서는 malloc()이나 calloc() 함수 등을 이용하여 메모리의 동적 할당을 수행합니다.

C++에서도 위의 함수를 사용할 수 있지만, 더 나은 방법인 new 연산자를 이용한 방법을 제공하고 있습니다.

 

문법

타입* 포인터이름 = new 타입;

첫 번째 타입은 데이터에 맞는 포인터를 선언하기 위해,

두 번째 타입은 메모리의 종류를 지정하기 위해 사용됩니다.

 

 -  만약 사용할 수 있는 메모리가 부족하여 새로운 메모리를 만들지 못했다면, new 연산자는 널 포인터를 반환합니다.

 -  new 연산자는  free store 이라고 불리는 메모리 공간(memory pool)에 객체를 위한 메모리를 할당받습니다.

 -  new 연산자를 통해 할당받은 메모리는 따로 이름이 없으므로 해당 포인터로만 접근할 수 있게 됩니다.

 


delete 연산자

C언어에서는 free() 함수를 이용하여 동적으로 할당받은 메모리를 다시 운영체제로 반환합니다.

이와 마찬가지로 C++에서는 delete 연산자를 사용하여, 더는 사용하지 않는 메모리를 다시 메모리 공간에 돌려줄 수 있습니다.

 

C++에서 delete 연산자는 다음과 같은 문법으로 사용합니다.

delete 포인터이름;

- new 연산자를 통해 생성한 메모리가 아닌 변수를 선언하여 생성한 메모리는 delete 연산자로 해제할 수 없습니다.

- delete 연산자는 반드시 new 연산자를 통해 할당된 메모리를 해제할 때에만 사용해야 합니다.

-한 번 해제한 메모리를 다시 해제하려고 시도하면 오류가 발생합니다.


예제

int* ptr_int = new int;
*ptr_int = 100;

double* ptr_double = new double;
*ptr_double = 100.123;

cout << "int형 숫자의 값은 " << *ptr_int << "입니다." << endl;
cout << "int형 숫자의 메모리 주소는 " << ptr_int << "입니다." << endl;
cout << "double형 숫자의 값은 " << *ptr_double << "입니다." << endl;
cout << "double형 숫자의 메모리 주소는 " << ptr_double << "입니다." << endl;

delete ptr_int;
delete ptr_double;

실행 결과

int형 숫자의 값은 100입니다.

int형 숫자의 메모리 주소는 0x1d83010입니다.

double형 숫자의 값은 100.123입니다.

double형 숫자의 메모리 주소는 0x1d83030입니다.

 


http://www.tcpschool.com/cpp/cpp_arrayPointer_malloc

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

 

728x90
반응형

'C++' 카테고리의 다른 글

C++ 클래스 생성 / 헤더파일.  (0) 2022.10.28
C++ 함수 포인터  (0) 2022.10.27
C++ 공용체 ( union )  (0) 2022.10.27
C++ 구조체  (0) 2022.10.27
C++ 학습 참고 사이트  (0) 2022.10.26