본문 바로가기
Object Oriented Programming(C++)/열혈 C++ 프로그래밍

C++ | 02-2 malloc과 free를 대신하는 new와 delete

by continue96 2021. 8. 2.

1. malloc과 free를 대신하는 new와 delete

1.1 동적할당을 위한 new와 delete

 데이터 영역과 스택 영역에 할당되는 메모리의 크기는 컴파일 타임(Compile Time)에 미리 결정된다. 하지만 힙 영역의 크기는 프로그램이 실행되는 도중인 런 타임(Run Time)에 사용자가 직접 결정하게 된다. 이렇게 런 타임에 메모리를 할당받는 것을 메모리의 동적할당(Dynamic Allocation)이라고 한다. C언어는 malloc과 free 함수를 통해 동적할당을 할 수 있으나, C++는 메모리의 동적할당을 위해 더욱 효과적인 new와 delete 연산자를 제공한다.

 

1.2 변수, 배열, 객체의 동적할당

 동적할당에 사용되는 포인터의 가장 큰 목적은 이름없는 메모리를 포인터에 할당하여 할당받은 공간에 접근하는 것이다. C++는 new 연산자와 포인터를 사용해 변수, 배열, 그리고 객체를 동적할당한다. 만약 사용할 수 있는 메모리가 부족하여 동적할당을 수행하지 못했을 경우, new 연산자는 예외 처리 std::bad_alloc을 반환한다. 한편, delete 연산자는 더 이상 사용하지 않은 메모리 공간을 해제하고 사용하던 공간을 다시 반환한다. 이때 delete 연산자는 반드시 new 연산자를 통해 할당된 메모리를 해제할 때 사용해야 하고, 한 번 해제한 메모리를 다시 해제하려고 하면 오류가 발생한다. new와 delete를 사용한 변수, 배열, 그리고 객체의 동적할당은 다음과 같은 형식을 따르면 된다. 

 

① 변수 동적할당과 해제
variableType* variableName = new variableType;
delete variableName;

/* 변수 동적할당과 해제의 예 */
int* ptr = new int(3); /* 소괄호로 변수를 초기화할 수 있습니다. */
delete ptr;

 

② 배열 동적할당과 해제
arrayType* arrayName = new arrayType[arraySize];
delete[] arrayName;

/* 배열 동적할당과 해제의 예 */
int* arr = new int[3] {0, 1, 2};	/* 중괄호로 배열을 초기화할 수 있습니다. */
delete[] arr;					/* 배열을 해제할 때 []를 반드시 작성합니다. */

 

③ 객체 동적할당과 해제
objectType* objectName = new objectType;
delete objectName;

/* 객체 동적할당과 해제의 예 */
Kakao* kakao = new Kakao("Kakao Games", 2020); /* 생성자로 객체를 초기화합니다. */
delete kakao;

 

NewDelete.cpp
#include <iostream>
using namespace std;

class NewDelete {
private:
	int x, y;

public:
	NewDelete(int x, int y) : x(x), y(y) { }

	void ShowPosition() const {
		cout << "[" << x << ", " << y << "]" << endl;
	}

	~NewDelete() { }
};

int main(void) {
	int size = 10;
	int* ptr = new int(10);						/* 변수를 동적할당 */
	double* arr = new double[size] { 0 };		/* 배열을 동적할당 */
	NewDelete* ND = new NewDelete(10, 20);	/* 객체를 동적할당 */

	cout << *ptr << endl;
	cout << *arr << endl;
	ND->ShowPosition();
	return 0;
}

 

NewDelete.cpp 실행 결과
10
0
[10, 20]

 

[한줄 요약] 메모리 동적할당
C++에서 변수, 배열, 그리고 객체는 new 키워드로 동적할당하고, delete 키워드로 해제한다.

2. 구조체에 대한 new와 delete 연산 문제 풀이

 

열혈 C++ 프로그래밍 | 문제 02-3 | 구조체에 대한 new, delete 연산

문제 1 구조체에 대한 복습을 겸할 수 있는 문제를 제시하겠다. 2차원 평면 상에서 좌표를 표현할 수 있는 구조체를 다음과 같이 정의하였다. typedef struct __Point {  int xpos;  int ypos; } Point; 위의 구.

continue96.tistory.com

댓글