본문 바로가기

C++

C++ malloc,callco,new

malloc, callco, new란
동적 메모리 할당을 할 때 사용한다.

 

동적 메모리 할당 이란

컴퓨터 프로그래밍에서 실행 시간 동안 사용할 메모리 공간을 할당하는 것을 말한다.

 

동적 메모리 할당을 이용하면 배열의 크기를 가변적으로 생성할 수 있다.
사용법을 보기 전에 저 3개의 차이가 있는데
malloc과 callco의 차이점은 생성할 때 초기화 값이 0이냐 쓰레기 값이냐 뿐이다.
malloc으로 생성한 동적 메모리는 쓰레기 값으로
calloc로 생성한 동적 메모리는 0으로 초기화가 된다.

 

동적 메모리 할당으로 생성된 메모리는 Heap 영역에 생성된다.
Heap 영역은 메모리로 직접 관리해야 한다는 특징이 존재한다. 그렇기 때문에
프로그래머는 동적 메모리 할당을 하고 해당 메모리를 다 사용하면 메모리 할당 해제를 항상 해주어야 한다.

 

이제 malloc, callco와 new의 차이점을 보자

malloc , calloc new
함수 (느림) operator (빠름)
C와C++ 에서 사용 가능 C++만 사용 가능
지정한 크기의 메모리 할당 객체 생성을 위한 메모리 할당
void*로 반환. 형변환 필수 형변환 필요 없음
실패시 NULL반환 실패시 exception발생
free로 해체 delete 혹은 delete[]로 해제
별도의 로직 호출 없음 생성자, 소멸자 호출
오버로딩 불가능 연산자 오버로딩 가능

 

malloc 사용하기

void main()
{
	int* array;
	array = (int*)malloc;
	*array = 10;
	cout << *array << endl;
    free(array);
}

제일 기본적인 문법이다. array의 int*의 동적 메모리를 할당하여 넣어주었다.
여기서 (int*)는 형 변환이다. float*이면 float*로 넣어주면 된다. 아무것도 하지 않으면 void*이다.

 

malloc으로 배열 만들기

void main()
{
	int* array;
	int value = 5;
	array = (int*)malloc(sizeof(int)* value);
	
	for (int i = 0; i < value; i++)
	{
		cout << array[i] << endl;
	}
}

배열로 만드는 법도 간단하다. (sizeof(int) * 만들 개수)
여기서 봐야 할 것은 만들 개수인데 원래 배열은 상수만 들어가기 때문에 프로그램 시작 중에는 크기를 지정하지 못하였다
하지만 동적 배열은 이를 가능하게 해준다. 해당 문구를 실행하면 5개의 쓰레기 값이 출력될 것이다.

 

calloc 사용하기

void main()
{
	int* array;
	int value = 5;
	array = (int*)calloc(value, sizeof(int));
	
	for (int i = 0; i < value; i++)
	{
		cout << array[i] << endl;
	}
}

calloc는 매개변수가 2개 존재하는데 (만들 개수, 메모리 크기)
value 만큼 만들 것이고 메모리 크기는 int형 4byte로 만들 것이다 라는 뜻이다.
실행시키면 5개의 0이 출력될 것이다. 이 부분이 malloc와의 차이점이다.

 

new 사용하기

void main()
{
	int* array;
	int value = 5;
	array = new int[value];

	for (int i = 0; i < value; i++)
	{
		cout << array[i] << endl;
	}
	
	delete[](array);
}

위의 문법과 별 차이는 없다 다만 좀 더 간결하다.
new 키워드 이후 만들고 반환할 자료형 배열의 크기만 넣어주면 된다.
출력 결과는 5개의 쓰레기 값이 나온다. new는 배열로 만들 경우에는 delete[]를 사용한다.
배열로 만들지 않은 경우에는 delete를 사용하면 된다.

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

C++ 연산자 오버로딩(Operator Overloading)  (0) 2020.09.06
C 파일입출력  (0) 2020.09.04
C++ 문자열 함수  (0) 2020.08.31
C++ char*와char[]  (0) 2020.08.28
C++ Point  (0) 2020.08.26