[CPP-Moudule / ex00: Heap of quadrupeds 과제]
Pony
class, containing whatever you think adequately describes a pony. Then, create two functions, ponyOnTheHeap
and ponyOnTheStack
.Pony
must be allocated on the heap
stack
.Pony objects
must not exist after the function hands off control.아래와 같은 Pony
클래스를 만들고 생성자와 소멸자를 정의해줬다. 생성자와 소멸자에서는 간단하게 인자로 받은 문자열을 그대로 출력해줘서, 인스턴스가 잘 생성되고 해제됐는지를 확인할 수 있게 했다.
//Pony.hpp
class Pony
{
private:
std::string memoryLocation_;
std::string num_;
public:
Pony(std::string str);
~Pony();
void setNum(std::string str) { num_ = str; }
std::string getNum() { return (num_); }
};
Pony
클래스를 메모리에 올릴 때는, stack
영역에 할당하는 방법과 heap
영역에 할당하는 두 가지 방법이 존재한다.
#include "Pony.hpp"
int main(void)
{
Pony stackPony("STACK"); // 정적할당
stackPony.setNum("Second"); //인스턴스 접근
std::cout << stackPony.getNum() << " Pony is on stack memory." << std::endl;
return (0);
}
stackPony
인스턴스가 생성되어 스택 영역에 올라가게 된다..
연산자를 통해 인스턴스에 접근할 수 있다.#include "Pony.hpp"
int main(void)
{
Pony *heapPony = new Pony("HEAP"); //동적할당
heapPony->setNum("First"); //인스턴스 접근
std::cout << heapPony->getNum() << " Pony is on heap memory." << std::endl;
delete heapPony;
return (0);
}
C에서는 malloc과 free로 힙(heap) 영역의 메모리 할당을 지원했다면, CPP에서는 new
와 delete
를 사용한다. CPP에서도 malloc을 사용할 수 있지만, new
키워드가 훨씬 더 많은 기능을 지원하기 때문에 대부분 new를 사용한다.
위 예제를 보면 Pony 클래스가 *heapPony
포인터에 할당된 걸 알 수 있다. 포인터의 가장 큰 목적은 런 타임에 이름 없는 메모리를 할당받아 포인터에 할당하여, 할당받은 메모리에 접근하는 것이다.
위 예제를 보면 알 수 있듯이 new
는 1.메모리 할당
, 2.생성자 호출
, 3.타입 변환
까지 총 세 가지의 일을 한다.
new
키워드 뒤에는 임의의 타입이 들어간다.->
로 포인터에 접근한다.delete
는 Pony.cpp 에서 정의한 1.소멸자를 자동으로 호출
하고 2.메모리를 해제
하는 두 가지 일을 한다.
delete
키워드가 필요하다.delete
로 해제할 수 있는 메모리 공간은 new
를 통해 할당한 공간만 해당된다.new
=> delete
, new[]
=> delete[]
로 쌍을 맞춰 사용한다.