[C++] 동적 할당 (new/delete 추가하기)

꿈별·2023년 5월 9일
0

C++

목록 보기
15/27

✔동적 할당

  • 메모리 영역
    1. 스택
      -> 지역 변수

    2. -> 동적 할당 메모리
    3. 데이터
      -> 전역/정적/외부 변수
    4. ROM (CODE/DATA)

정적 할당 vs 동적 할당

  • 정적 할당
    : 스택, 데이터 영역은 함수가 호출될 때/프로그램이 실행될 때 메모리 할당이 정해진다.

    • 컴파일 단계에서 발생
    • 메모리 누수 걱정 X
    • 메모리 크기가 정해져 있으므로 런타임 도중 수정할 수 없다.
      -> 메모리 공간의 낭비가 발생할 수 있다.

  • 동적 할당
    : Heap 영역은 프로그램 실행 도중에 실시간 대응이 가능하다.

    • 런타임 중에 발생
    • 사용자가 메모리를 직접 할당하고, 직접 해제해야 한다.
      -> 메모리 누수 위험 O

  • 동적 할당/해제 방법
    • C : malloc() , free() 👉 함수
    • C++ : new, delete 👉 키워드

C

할당 - malloc()

: 메모리 할당 함수
사용자가 지정한 크기만큼 힙 영역에 메모리를 할당시켜 준다.

함수 원형

void * malloc(size_t _Size)
  • 왜 반환 타입이 void* 일까?

👉 malloc() 함수는 입력 인자로 바이트 수를 요청받는다.
요청받은 메모리를 할당해 주고 단순히 그 주소를 넘겨주기만 하는 역할일 뿐이지,
이 메모리 공간이 어떤 타입으로 사용될지 사용자가 포인터 타입을 통해 직접 결정하기 때문에 주소를 void 포인터로 반환한다.


  • 예시1
int* pInt = (int*)malloc(100);

: 힙 영역에 100byte가 생성되고, 그 주소를 포인터 변수로 받음

-> malloc() 의 반환 타입이 void 포인터이기 때문에, int 포인터로 형변환 해준 후 포인터 변수에 주소값을 준다.

  • 예시2
float* pF = (float*)malloc(4);
int* pI = (int*)pF;

: 4byte 할당받은 힙 주소를 float 포인터로 받고, 그걸 int 포인터로 가리킴

-> pI, pF 두 포인터 모두 같은 공간의 주소를 가리키고 있음

  • 부동소수점 표현 방식의 숫자를 대입한 후, 정수로 읽어오면?
*pF = 2.4f;

int i = *pI;

-> 부동소수점 방식으로 표현된 2.4f를 정수로 읽게 되었으므로 엄청 큰 수로 표현된다.


해제 - free()

: 전달받은 주소가 가리키는 곳에 할당되어 있는 힙 메모리를 해제시켜 줌

함수 원형

void free(void* ptr);

예시

int iInput = 0;
scanf_s("%d"m &iInput);

int* pInt = nullptr;

if (100 == IInput)
{
	pInt = (int*)malloc(100);
}

if(nullptr != pInt)
{
	free(pInt); //힙 메모리 해제
}
return 0;

C++

할당 - new

해제 - delete


동적 할당의 특징

  1. 런타임 도중에 대응 가능
  2. 사용자가 직접 메모리를 관리해야 함(할당/ 해제)
  • 스택, 데이터 영역
    : 함수가 호출될 때/프로그램이 실행될 때 메모리 할당이 정해져서, 함수/프로그램 종료 시에 할당되었던 만큼만 메모리를 해제하면 된다.
    -> 컴파일러가 수행하므로 사용자가 일일이 명령할 필요가 없다
  • But 힙 영역(동적 메모리)
    : 사용자가 직접 할당된 메모리를 해제해줘야 한다.

함수 예시

void Test(int a)
{
	printf("%d\n", a);
}
  • 함수 호출/종료 시의 스택 메모리 할당/반환 여부가 나타나 있음

동적할당 에시

  • 아래의 경우, scanf_s 호출 시 100을 입력해주지 않으면 100byte가 할당이 되지 않는다.
int iInput = 0;
scanf_s("%d", &iInput);

if (100 == IInput)
{
	malloc(100);
}
  • 동적 할당은 메모리를 해제하지 않고 종료하는 것을 방지하기 위해 신경써줘야 함
    -> 해제 안 하고 종료시키면 메모리 누수가 발생하여, 사용하지 않는 메모리들이 쌓인다
    👉 심각해지면 메모리 부족 현상 발생

동적 할당의 활용
-> 가변 배열(다음 포스트)


[참고]
https://youtu.be/3QIbwZVh-oU
https://youtu.be/v2NUpzV6bpE
정적 할당&동적 할당
정적 할당vs동적 할당
C++ 2차원 vector 동적할당하기

0개의 댓글