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
'Object Oriented Programming(C++) > 열혈 C++ 프로그래밍' 카테고리의 다른 글
C++ | 03-1 구조체(Structure) (0) | 2021.08.08 |
---|---|
C++ | 02-3 C++에서 C언어 표준함수 호출하기(C Standard Library) (0) | 2021.08.02 |
C++ | 02-1 참조자(Reference) (0) | 2021.08.02 |
C++ | 01-5 이름공간(Namespace) (0) | 2021.07.31 |
C++ | 01-4 인라인 함수(Inline Function) (0) | 2021.07.24 |
댓글