본문 바로가기
Language&Framework&Etc/C++

C언어 기반의 C++ 2(02-5) malloc & free를 대신하는 new & delete

by 머리올리자 2020. 12. 23.

new & delete

길이정보를 인자로 받아, 문자열 저장이 가능한 배열을 생성하고, 그 배열의 주소 값을 반환하는 정의

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

using namespace std;

char* makestradr(int len)
{
	char* str = (char*)malloc(sizeof(char) * len); // 문자열 저장을 위한 배열을 힙 영역에 할당하고 있다.
	return str;
}

int main(void)
{
	char* str = makestradr(20);
	strcpy(str, "I am so happy");
	cout << str << endl;
	free(str);
	return 0;
}

위 예제는 C언어에서의 동적할당. 그러나 이 방법에는 다음의 두 가지의 불편함이 있다.

  • 할당할 대상의 정보를 부조건 바이트 크기단위로 전달
  • 반환형이 void형 포인터이기 때문에 적절한 형 변환

C++에서 제공하는 키워드 new와 delete를 사용하면 이러한 불편한 점이 사라진다.

malloc → new

free  delete

 

키워드 new의 사용법

  • int형 변수의 할당                      int * ptr1 = new int;
  • double형 변수의 할당                 → double * ptr2 = new double;
  • 길이가 3인 int형 배열의 할당       int * arr = new int[3];
  • 길이가 7인 double형 배열의 할당 → double * arr2 = new double[7];

키워드 delete의 사용법

  • 할당한 int형 변수의 소멸              → delete ptr1;
  • 할당한 double형 변수의 소멸        → delete ptr2;
  • 할당한 int형 배열의 소멸              → delete []arr1;  
  • 할당한 double형 배열의 소멸        → delete []arr2;

예제

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

using namespace std;

char* makestradr(int len)
{
	//char* str = (char*)malloc(sizeof(char) * len);
	char* str = new char[len];
	return str;
}

int main(void)
{
	char* str = makestradr(20);
	strcpy(str, "I am so happy");
	cout << str << endl;
	//free(str);
	delete []str;
	return 0;
}

 


객체의 생성에서는 반드시 new & delete

기존의 malloc가 free 함수의 호출이 어떻게 문제가 될 수 있는지 간단히 언급

#include <iostream>
#include <stdlib.h>
using namespace std;

class Simple
{
public:
	Simple()
	{
		cout << "Constructor" << endl;
	}
};

int main(void)
{
	cout << "case 1: ";
	Simple* sp1 = new Simple;

	cout << "case 2: ";
	Simple* sp2 = (Simple*)malloc(sizeof(Simple) * 1);

	cout << endl << "end of main" << endl;
	delete sp1;
	free(sp2);

	return 0;
}

단순히 보면 new로 할당된 변수에 대해서는 "Contructor"가 출력되는 반면, malloc으로 할당된 변수에 대해서는 출력되지 않았다.

 

"new와 malloc 함수의 동작방식에는 차이가 있다."

 


힙에 할당된 변수? 이제 포인터를 사용하지 않아도 접근할 수 있음.

new 연산자를 이용해서 할당된 메모리 공간에도 참조자의 선언이 가능할까?

C++에서는 new 연산자를 이용해서 할당된 메모리 공간도 변수로 간주하여, 참조자의 선언이 가능하도록 하고 있다.

 

따라서 다음 문장 가능

int * ptr = new int;
int &ref = *ptr // 힙 영역에 할당된 변수에 대한 참조자 선언
ref = 20;
cout << *ptr << endl; // 출력 결과 20

참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.