[CPP-01] 클래스의 정적할당과 동적할당 new, delete
new 는 1.메모리 할당, 2.생성자 호출, 3.타입 변환 까지 총 세 가지의 일을 한다. malloc보다 훨씬 유용하다.
[CPP-Moudule / ex00: Heap of quadrupeds 과제]
Make a
Ponyclass, containing whatever you think adequately describes a pony. Then, create two functions,ponyOnTheHeapandponyOnTheStack.In the first one, the
Ponymust be allocated on theheapIn the second one it must be allocated on the
stack.
In both cases, the
Pony objectsmust not exist after the function hands off control.
고민한 지점
CPP에서의 동적할당 방법
정적할당과 동적할당 시 클래스에 어떤 차이가 생기는지
인스턴스 접근 방법
인스턴스 소멸 방법
quadrupeds 가 뭐지?
사족보행이라네..
아래와 같은 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 영역에 할당하는 두 가지 방법이 존재한다.

1. Stack 정적할당
#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인스턴스가 생성되어 스택 영역에 올라가게 된다..연산자를 통해 인스턴스에 접근할 수 있다.스택 메모리의 데이터는 함수 영역을 벗어나면 자동으로 소멸되기 때문에, 메모리 해제가 따로 필요없다.
2. Heap 동적할당
#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 포인터에 할당된 걸 알 수 있다. 포인터의 가장 큰 목적은 런 타임에 이름 없는 메모리를 할당받아 포인터에 할당하여, 할당받은 메모리에 접근하는 것이다.
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
Was this helpful?