---
description: new 는 1.메모리 할당, 2.생성자 호출, 3.타입 변환 까지 총 세 가지의 일을 한다. malloc보다 훨씬 유용하다.
---

# \[CPP-01] 클래스의 정적할당과 동적할당 new, delete

**\[CPP-Moudule / ex00: Heap of quadrupeds 과제]**&#x20;

* Make a `Pony` class, containing whatever you think adequately describes a pony. Then, **create two functions**, `ponyOnTheHeap` and `ponyOnTheStack`.
  * In the first one, the `Pony` must be allocated on the `heap`
  * 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` 클래스를 만들고 생성자와 소멸자를 정의해줬다. 생성자와 소멸자에서는 간단하게 인자로 받은 문자열을 그대로 출력해줘서, 인스턴스가 잘 생성되고 해제됐는지를 확인할 수 있게 했다.

```cpp
//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` 영역에 할당하는 두 가지 방법이 존재한다.

![](https://github.com/hidaehyunlee/Fork-my-brain/tree/4f7d19f4487fe8d450e22a9b6451bbed865ce125/images/74f8e5b1-8bfe-4b50-aff7-937e6938eb54-image.png)

## 1. Stack 정적할당

```cpp
#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 동적할당

```cpp
#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[]`로 쌍을 맞춰 사용한다.
