메모리 할당
new와 delete를 사용하면 malloc와 free를 대체하여 메모리를 할당할 수 있다.
#include <iostream>
#include <string.h>
#include <stdlib.h>
char *MakeStr(int len) {
char* str = (char*)malloc(sizeof(char)*len);
return str;
}
int main()
{
char* str = MakeStr(20);
strcpy(str, "Hello World!");
std::cout << str;
free(str);
return 0;
}
위와 같이 C++에서도 malloc와 free를 사용한 메모리 할당이 가능하다.
그러나 위 방법을 사용할 경우 두 가지 불편한 점이 존재한다.
할당할 대상의 정보를 반드시 바이트 크기로 전달해야 하며 반환형이 void포인터이기 때문에 적절히 형 변환을 해주어야한다.
이때 new와 delete를 사용하면 이러한 불편한 점을 해결할 수 있다.
new
new를 사용하여 메모리를 할당하는 방법은 아래와 같다.
int* ptr1 = new int;
double* ptr2 = new double;
int *arr1 = new int[3];
double *arr2 = new double[5];
위 코드에서 ptr1과 ptr2에는 각각 int형과 double형의 자료가 들어갈 수 있는 메모리가 할당되며
arr1에는 길이가 3인 int형 배열, arr2에는 길이가 5인 double형 배열이 할당된 것이다.
동적 배열 초기화
동적 배열을 선언과 동시에 0으로 초기화하는 방법은 다음과 같다.
int *arr = new int[5]();
C++11 이전에는 동적배열을 일괄적으로 0이 아닌 값으로 초기화하는 방법이 없었기 때문에
개별적으로 초기화를 진행해주어야만 했다.
그러나 C++11부터는 다음과 같은 방법을 사용하여 초기화하는 것이 가능하다.
int *arr = new int[5] {0, 1, 2, 3, 4};
정적 배열도 같은 방법으로 초기화하는 것이 가능하다.
int arr[5] {0, 1, 2, 3, 4};
또한 정적 배열은 위 방법을 사용하여 초기화를 진행할 경우 선언 시에 배열의 개수를 명시하지 않아도 된다.
int arr[] {0, 1, 2, 3, 4};
delete
메모리를 해제할 때에는 delete를 사용할 수 있다.
이때 자료형을 명시해 줄 필요는 없지만 아래 코드처럼 배열인지 변수인지는 구분하여 사용하여야 한다.
delete ptr1;
delete ptr2;
delete []arr1;
delete []arr2;
힙에 할당된 변수에 접근
new 지시자와 &연산자를 사용하여 포인터를 사용하지 않고도 힙 영역에 할당된 변수에 접근하는 것이 가능하다.
int *ptr = new int;
int &ref = *ptr;
ref = 20;
std::cout<<*ptr;
20이 정상적으로 출력되는 것을 확인할 수 있다.
new와 delete를 사용하는 이유
new와 delete 또한 &연산자를 공부할 때와 마찬가지로 근본적인 문제에 부딪혔다.
도대체 이것이 왜 필요한가? 그냥 포인터를 사용하고 malloc를 사용하면 되는 것 아닌가?
이에 대한 답은 아래와 같다.
malloc와 free를 사용하는 것과 new와 delete를 사용하는 것은 동작방식에서 차이가 있다.
malloc와 free를 사용할 경우 프로그램에 문제가 발생할 가능성이 있어 new와 delete를 사용하는 것이 좋다.
* malloc을 사용할 경우 생성자가 호출되지 않는 등의 문제가 있다.
'C++ > C++ 문법' 카테고리의 다른 글
[C++] 클래스, 접근제어지시자(public, private), const 함수 (0) | 2024.03.21 |
---|---|
[C++] 구조체 (0) | 2024.03.10 |
[c++] 참조자 (0) | 2024.03.09 |
[C++] C++에서 C언어 헤더파일 호출 (0) | 2024.03.09 |
[C++] 인라인 함수 (inline function) (0) | 2024.03.01 |