티스토리 뷰

주의 사항!

  • 이 글은 제가 직접 공부하는 중에 작성되고 있습니다.
  • 따라서 제가 이해하는 그대로의 내용이 포함됩니다.
  • 따라서 이 글은 사실과는 다른 내용이 포함될 수 있습니다.


C언어를 배우면서 malloc 함수와 free 함수를 이용해 동적으로 메모리를 할당하는 방법을 배웠습니다. 이를 사용해 길이 정보를 인자로 받아서, 해당 길이의 문자열 저장이 가능한 배열을 생성하고, 그 배열의 주소 값을 반환하는 함수를 정의한 예제를 살펴보겠습니다.

#include <iostream>
#include <string.h>
#include <stdlib.h>

using std::cout;
using std::cin;
using std::endl;

char* MakeStrAdr(int len)
{
	char* str = (char*)malloc(sizeof(char) * len);

	return str;
}

int main(void)
{
	char* str = MakeStrAdr(20);
	strcpy(str, "I am happy~");
	cout << str << endl;
	free(str);

	return 0;
}

/*
실행결과

I am happy~

*/

 

이 예제는 malloc과 free를 활용해 동적으로 메모리를 할당했습니다. 그런데 이 방법은 할당할 메모리의 크기를 무조건 바이트 단위로 정해주어야 하고, malloc 함수의 반환형이 void 포인터이기 때문에 알맞게 형 변환을 해주어야 하는 불편한 점이 있습니다.

 

하지만 C++에서 제공하는 키워드 new와 delete를 사용하면 이런 불편함이 사라집니다. new는 malloc을, delete는 free를 대신합니다. new와 delete를 사용하는 예를 살펴보겠습니다.

//new 키워드 사용 예시
int * ptr1 = new int;          //int형 변수 할당
double * ptr2 = new double;    //double형 변수 할당
int * ary1 = new int[3];       //int형 배열요소 3개인 배열 할당
char * ary2 = new char[20];    //char형 배열요소 20개인 배열 할당

//delete 키워드 사용 예시
delete ptr1;                   //앞서 할당한 int형 변수 소멸
delete ptr2;                   //앞서 할당한 double형 변수 소멸
delete []ary1;                 //앞서 할당한 int형 배열 소멸
delete []ary2;                 //앞서 할당한 char형 배열 소멸

 

delete 키워드를 사용할 때 소멸하고자 하는 메모리가 배열인 경우 []를 추가로 명시해주기만 하면 됩니다. new와 delete의 사용법은 상당히 직관적이라 이해하기가 쉽습니다.

 

이제 new와 delete를 사용하여 앞서 i am happy~를 출력했던 예제를 수정해보겠습니다.

#include <iostream>
#include <string.h>

using std::cout;
using std::cin;
using std::endl;

char* MakeStrAdr(int len)
{
	char* str = new char[len];

	return str;
}

int main(void)
{
	char* str = MakeStrAdr(20);
	strcpy(str, "I am happy~");
	cout << str << endl;
	delete[]str;

	return 0;
}

/*
실행결과

I am happy~

*/

 

new와 delete 키워드를 사용하면 malloc과 free를 사용하던 때와 달리 stdlib.h 헤더파일을 인클루드 하지 않아도 됩니다.

 

new와 delete를 배웠으니 앞으로 C++에서는 malloc과 free는 절대 사용하지 않길 권합니다. new와 malloc은 동작하는 방식이 서로 다르고, 특히 C++에서는 malloc과 free 함수의 호출이 문제를 일으킬 수 있습니다. 자세한 내용은 나중에 클래스와 객체, 생성자에 대해 알고 나면 이해할 수 있습니다.

 

new 연산자로 동적 할당한 메모리 공간에 참조자 선언

참조자의 선언은 상수가 아닌 변수를 대상으로만 가능하다고 배웠습니다. 그렇다면 new연산자를 이용해 할당된 메모리 공간에도 참조자의 선언이 가능할까요? 정의에 따르면, 변수의 자격을 갖추기 위해서는 메모리 공간이 있어야 하고, 그 공간에 이름이 존재해야 합니다. new연산자를 이용해 할당된 메모리 공간은 이름이 없습니다. 하지만 C++에서는 new연산자를 이용해 할당된 메모리 공간도 변수로 간주합니다. 따라서 아래와 같이 참조자의 선언이 가능합니다.

int * ptr1 = new int;
int &ref = *ptr1;
ref = 20;
cout << *ptr << endl;

/*
실행결과

20

*/

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함