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

이대현·2021년 4월 19일
2

C / CPP

목록 보기
14/28

[CPP-Moudule / ex00: Heap of quadrupeds 과제]

  • 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 클래스를 만들고 생성자와 소멸자를 정의해줬다. 생성자와 소멸자에서는 간단하게 인자로 받은 문자열을 그대로 출력해줘서, 인스턴스가 잘 생성되고 해제됐는지를 확인할 수 있게 했다.

//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에서는 newdelete를 사용한다. CPP에서도 malloc을 사용할 수 있지만, new 키워드가 훨씬 더 많은 기능을 지원하기 때문에 대부분 new를 사용한다.

위 예제를 보면 Pony 클래스가 *heapPony 포인터에 할당된 걸 알 수 있다. 포인터의 가장 큰 목적은 런 타임에 이름 없는 메모리를 할당받아 포인터에 할당하여, 할당받은 메모리에 접근하는 것이다.

2.1. new()

위 예제를 보면 알 수 있듯이 new1.메모리 할당, 2.생성자 호출, 3.타입 변환 까지 총 세 가지의 일을 한다.

  • new 키워드 뒤에는 임의의 타입이 들어간다.
  • 동적 할당 시에는 ->로 포인터에 접근한다.

2.2. delete()

delete는 Pony.cpp 에서 정의한 1.소멸자를 자동으로 호출하고 2.메모리를 해제하는 두 가지 일을 한다.

  • 힙 메모리의 데이터는 프로그래머에 의해 생성 및 해제되기 때문에 delete 키워드가 필요하다.
  • delete로 해제할 수 있는 메모리 공간은 new를 통해 할당한 공간만 해당된다.
  • new => delete, new[] => delete[]로 쌍을 맞춰 사용한다.
profile
삽질의 기록들 👨‍💻

0개의 댓글