[CPP-01] 클래스의 정적할당과 동적할당 new, delete
new 는 1.메모리 할당, 2.생성자 호출, 3.타입 변환 까지 총 세 가지의 일을 한다. malloc보다 훨씬 유용하다.
[CPP-Moudule / ex00: Heap of quadrupeds 과제]
Make a
Pony
class, containing whatever you think adequately describes a pony. Then, create two functions,ponyOnTheHeap
andponyOnTheStack
.In the first one, the
Pony
must be allocated on theheap
In the second one it must be allocated on the
stack
.
In both cases, the
Pony objects
must not exist after the function hands off control.
고민한 지점
CPP에서의 동적할당 방법
정적할당과 동적할당 시 클래스에 어떤 차이가 생기는지
인스턴스 접근 방법
인스턴스 소멸 방법
quadrupeds 가 뭐지?
사족보행이라네..
아래와 같은 Pony
클래스를 만들고 생성자와 소멸자를 정의해줬다. 생성자와 소멸자에서는 간단하게 인자로 받은 문자열을 그대로 출력해줘서, 인스턴스가 잘 생성되고 해제됐는지를 확인할 수 있게 했다.
Pony
클래스를 메모리에 올릴 때는, stack
영역에 할당하는 방법과 heap
영역에 할당하는 두 가지 방법이 존재한다.
1. Stack 정적할당
선언만으로도
stackPony
인스턴스가 생성되어 스택 영역에 올라가게 된다..
연산자를 통해 인스턴스에 접근할 수 있다.스택 메모리의 데이터는 함수 영역을 벗어나면 자동으로 소멸되기 때문에, 메모리 해제가 따로 필요없다.
2. Heap 동적할당
C에서는 malloc과 free로 힙(heap) 영역의 메모리 할당을 지원했다면, CPP에서는 new
와 delete
를 사용한다. CPP에서도 malloc을 사용할 수 있지만, new
키워드가 훨씬 더 많은 기능을 지원하기 때문에 대부분 new를 사용한다.
위 예제를 보면 Pony 클래스가 *heapPony
포인터에 할당된 걸 알 수 있다. 포인터의 가장 큰 목적은 런 타임에 이름 없는 메모리를 할당받아 포인터에 할당하여, 할당받은 메모리에 접근하는 것이다.
2.1. new()
위 예제를 보면 알 수 있듯이 new
는 1.메모리 할당
, 2.생성자 호출
, 3.타입 변환
까지 총 세 가지의 일을 한다.
new
키워드 뒤에는 임의의 타입이 들어간다.동적 할당 시에는
->
로 포인터에 접근한다.
2.2. delete()
delete
는 Pony.cpp 에서 정의한 1.소멸자를 자동으로 호출
하고 2.메모리를 해제
하는 두 가지 일을 한다.
힙 메모리의 데이터는 프로그래머에 의해 생성 및 해제되기 때문에
delete
키워드가 필요하다.delete
로 해제할 수 있는 메모리 공간은new
를 통해 할당한 공간만 해당된다.new
=>delete
,new[]
=>delete[]
로 쌍을 맞춰 사용한다.
Last updated