일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- deep learning
- 회귀
- Classification
- 머신러닝
- gpt
- 해커톤
- regression
- LG Aimers
- GPT-4
- Machine Learning
- 분류
- 딥러닝
- ChatGPT
- PCA
- 지도학습
- supervised learning
- 티스토리챌린지
- LLM
- OpenAI
- 오블완
- LG
- LG Aimers 4th
- AI
- Today
- Total
SYDev
C++ Chapter 02-5 : malloc & free를 대신하는 new & delete 본문
동적 메모리 할당 & 정적 메모리 할당
동적 메모리 할당
: 동적 메모리 할당은 컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것이다.
정적 메모리 할당
: 정적 메모리 할당은 메모리 할당 방법 중 하나로, 프로그램이 실행될 때 이미 메모리의 크기가 결정된다.
정적 메모리 할당의 예시는 다음과 같다.
char examples[10];
위처럼 코드를 입력하면 char 자료형 10개가 나란히 선언되고, examples 배열에는 10개의 자료형만 들어갈 수 있다.
동적 메모리 할당을 하는 이유?
정적 메모리 할당을 하면 기억공간이 낭비될 경우가 생긴다. 예를 들어서 위에서 선언한 examples에는 10글자를 넣을 수 있는데 이에 미치지 못하는 글자수를 가진 문자형을 넣는다면 그만큼 메모리가 낭비된다. 이런 낭비를 최소화 하기 위해서 프로그램 실행 중에 입력되는 데이터에 맞게 기억공간을 할당할 필요가 있다.
동적 메모리 할당의 과정
1. 포인터 변수를 선언
2. 임의의 저장 공간을 원하는 만큼 할당받고 그 주소를 포인터에 저장
3. 포인터를 이용해 할당받은 메모리 공간을 사용
4. 사용이 끝나면 할당받은 메모리를 해제하여 운영체제에 반납
Malloc & Free(C언어)
c++에서 메모리를 동적으로 할당하는 함수에 대해서 알아보기 전에 c언어의 malloc & free 함수를 알아보자.
malloc & free 함수를 이용하기 위해서는 헤더파일(stdlib.h)이 include 되어있어야 한다.
#include <stdlib.h>
동적 메모리 할당의 1번 과정인 포인터를 하나 선언한다.
char *str = NULL;
char형 포인터 str을 선언하였고, NULL로 초기화하였다.
다음으로 저장공간을 할당받고 포인터에 주소를 저장한다.
str = (char*)malloc(20)
여기서 malloc 함수가 처음으로 등장하는데 이를 이용하여 괄호 안의 byte만큼 저장 공간을 만들어서 그 주소를 포인터에 저장할 수 있다. 해당 코드를 자세히 알아보면 다음과 같다.
포인터를 받을 변수 = (자료형) malloc(할당받을 바이트 수)
위 코드에서 '자료형'은 '포인터를 받을 변수'의 자료형과 일치해야 한다.
다음으로 위의 3번 과정처럼 동적 메모리 할당을 한 'str'을 이용해 저장공간을 사용한다.
strcpy(str, "안녕하세요.");
printf("%s|n", str);
strcpy 함수 : 헤더파일 <string.h>에 포함된 함수로, strcpy(dest, origin) -> origin에 있는 문자열 전체를 dest로 복사하는 함수
마지막으로 과정으로 할당된 메모리를 해제한다.
free(str)
free() 함수의 괄호 안에 메모리가 할당된 포인터를 입력하면 할당된 메모리 공간을 다시 운영체제에 반납한다. 이 부분을 생략한다면 할당된 동적 메모리가 많아져 메모리 오류가 발생하거나 운영체제, 프로그램이 느려질 수 있기 때문에 필수적으로 진행해야 하는 과정이다.
New & Delete
c++에서 malloc & free 함수를 대체하는 것이 new & delete 함수이다.
우선 new 함수의 사용방법을 정리하자면 다음과 같다.
int * ptr1 = new int; // int형 변수의 할당
double * ptr2 = new double; // double형 변수의 할당
int * arr1 = new int[3]; // 길이가 3인 int형 배열의 할당
double * arr2 = new double[7]; // 길이가 7인 double형 배열의 할당
delete 함수의 사용 방법은 다음과 같다.
delete ptr1; // 앞서 할당한 int형 변수의 소멸
delete ptr2; // 앞서 할당한 double형 변수의 소멸
delete []arr1; // 앞서 할당한 int형 배열의 소멸
delete []arr2; // 앞서 할당한 double형 배열의 소멸
이와 관련하여 다음 예제를 살펴보자.
#include <iostream>
#include <string.h>
using namespace std;
char * MakeStrAdr(int len)
{
char * str= new char[len];
return str;
}
int main(void)
{
char * str = MakeStrAdr(20);
strcpy(str, "I am so happy~");
cout<<str<<endl;
delete []str;
return 0;
}
I am so happy~
malloc & free 함수와 비교했을 때 new&delete 함수가 훨씬 간결한 코드를 보이는 것을 알 수 있다. 또한, c++에서는 malloc & free 함수의 호출이 문제가 될 수 있으니 해당 함수의 호출은 삼가해야 한다.
동적 할당된 메모리 공간의 참조자 선언
참조자 선언은 (const 참조자가 아닌 이상) 상수가 아닌 변수를 대상으로만 가능하다. 그렇다면 new 연산자를 이용하여 할당된 메모리 공간에도 참조자 선언이 가능할까? c++에서는 할당된 메모리 공간도 변수로 간주하기 때문에 참조자의 선언이 가능하다.
#include <iostream>
using namespace std;
int main(void)
{
int *ptr = new int;
int &ref = *ptr;
ref = 20;
cout<<*ptr<<endl;
return 0;
}
20
흔히 사용되는 문장은 아니지만 포인터 연산 없이 힙(Heap) 영역에 접근했다는 사실을 주목할 필요가 있다.
참고자료
- 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12
'Programming Lang > C++' 카테고리의 다른 글
C++ Chapter 03-1 : C++에서의 구조체 (0) | 2023.07.12 |
---|---|
C++ Chapter 02-6 : C++에서 C언어의 표준함수 호출하기 (0) | 2023.07.11 |
C++ Chapter 02-4 : 함수에서의 참조자(Reference)(2) (0) | 2023.07.11 |
C++ Chapter 02-4 : 함수에서의 참조자(Reference)(1) (1) | 2023.07.10 |
C++ Chapter 02-3 : 참조자(Reference) (0) | 2023.07.06 |