[c++] new 사용을 지양해야 하는 이유( + RAII)

숭글·2023년 1월 3일
0

할당을 위해선 보통 아래 두 가지 방법 중 하나를 사용한다.

  • automatic allocation
    : 스택에 할당한다.
  • dynamic allocation
    : 힙에 할당한다.

스택에 할당하는 것과 힙에 할당하는 것은 각각 특징이 있다.

스택에 할당 (Stack Allocation)

  • 메모리 할당을 순차적으로 한다.
  • 메모리를 역순으로 해제한다. (FILO : First In Last Out)
  • 할당될 메모리의 크기를 컴파일러가 알고있어 메모리를 할당하고 해제할 때 컴파일러에서 정의된 routine을 따라 수행된다.
  • 다음 할당될 주소가 implicit하기 때문에 빠르게 할당하고 해제할 수 있다.
  • 새로운 scope에 들어가면 자동으로 구분하여 할당한다(automatic storage). scope을 벗어나면 자동으로 해당 블록의 변수를 해제한다(flush automatically).
    • 자동으로 소멸자가 호출된다.
  • 힙 메모리에 비해 저장 공간이 적다.
  • C++에선 RAII라는 기술을 이용하여 자원의 lifetime과 객체의 lifetime을 일치시켜 자원을 관리할 수 있다. (자원을 객체로 wrapping한다.)
    • 실제로 std::string 클래스를 이용하여 객체를 생성하면 정해진 메모리 크기가 아닌 다양한 크기의 메모리를 할당한다.
      다양한 크기의 메모리를 할당하지만 자원을 수동으로 관리하지 않아도돼서 동적 할당의 이점을 이용할 수 있다.

힙에 할당 (Heap Allocation)

  • 유연한 메모리 할당을 할 수 있다.
  • 할당할 크기와 언제까지 사용할 지 모르기때문에 할당이 느리다.
    • delete, delete [] 를 이용해 메모리를 수동으로 해제해야한다.
    • 해제하는 순간을 모르기 때문에 유연할 수 있다.
  • 자료구조 힙과는 관련없다. '무엇인가를 차곡차곡 쌓아올린 더미'라는 뜻으로 힙이라고 불린다.
  • 힙 메모리에 할당되지만 객체에 대한 참조 정보는 스택에 생성된다.
  • 힙에 할당된 변수는 스레드 간 공유될 수 있으므로 스택에 할당하는 것이 더 안전한다.
  • 프로그래머가 해제를 수동으로 해줘야하고, 잘 처리하지 못하면 메모리 leak이 발생할 수 있다.

힙에 할당해야 하는 경우

힙을 사용하면 스택을 사용하는 것보다 더 느리고 메모리를 수동으로 해제해줘야한다는 단점이 있지만 동적 할당(힙 할당)을 하는 것이 더 유용한 상황이 있다.

  • 할당해야하는 메모리 크기를 알 수 없을 때(또는 너무 클 때)

    • 외부 파일을 프로그램 내에서 읽어야하는 상황엔 파일의 크기를 프로그램을 실행하기 전까지는 할 수 없어 할당한 메모리 양을 결정할 수 없다.
  • 현재 scope을 나간 후에도 메모리를 유지해야할 때


참조 1

참조 2

profile
Hi!😁 I'm Soongle. Welcome to my Velog!!!

0개의 댓글