250x250
반응형
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

재 현

C++의 메모리 본문

C++

C++의 메모리

본명은이점례 2023. 7. 31. 18:46
728x90

이번 글에서는 C++에서의 메모리 관리에 대해 다뤄보겠습니다. C++은 다른 언어들과는 다르게 메모리 관리를 개발자가 직접 해야하는 언어로, 메모리 누수나 잘못된 메모리 접근으로 인한 버그들이 발생할 수 있습니다. 따라서 C++ 개발자는 메모리 관리에 대한 이해가 필수적입니다. (제가 처음 PR을 올렸을때, 메모리 해제에 대한 리뷰가 왕 많이 달렸었던 걸 생각하면... 필수입니다.)

 

이 글에서는 주요 개념들인 가비지 컬렉션, 정적 메모리, 동적 메모리, 할당 방법, 스마트 포인터, 그리고 RAII에 대해 살펴보겠습니다.

 

가비지 컬렉션 (Garbage Collection)

 

가비지 컬렉션은 C++에는 기본적으로 내장되어 있지 않습니다. 이는 C++의 주요 특징 중 하나로 개발자가 메모리 관리를 직접 해야하는 이유 중 하나입니다. 가비지 컬렉션은 런타임 시 자동으로 더 이상 사용하지 않는 메모리를 감지하고 해제하는 기술입니다. 이를 편리하게 하기 위해서 스마트 포인터와 RAII를 활용하면 됩니다. C++ 대신 자동 메모리 관리가 필요한 경우에는 Java와 같은 다른 언어들을 고려할 수 있습니다.


정적 메모리 (Static Memory)와 동적 메모리 (Dynamic Memory)

 

  • 정적 메모리: 프로그램이 시작될 때 할당되며, 프로그램이 종료될 때까지 유지됩니다. 정적으로 할당된 메모리의 크기는 컴파일 타임에 결정됩니다.
  • 동적 메모리: 프로그램이 실행 중에 필요한 메모리를 동적으로 할당하고 해제하는 것을 의미합니다. 실행 중에 크기가 변경될 수 있으며, 메모리를 필요로 하는 시점에 할당됩니다.

 

정적 할당 (Static Allocation)과 동적 할당 (Dynamic Allocation):

 

  • 정적 할당: 프로그램의 컴파일 시간에 메모리를 할당하고, 변수가 스코프를 벗어나면 자동으로 해제됩니다. 정적 할당은 주로 전역 변수나 정적 변수에서 사용됩니다.
  • 동적 할당: 프로그램의 실행 중에 필요한 메모리를 동적으로 할당하고, 할당 받은 메모리는 사용이 끝나면 명시적으로 해제해야 합니다. 동적 할당은 'new' 연산자를 사용하여 할당하고, 'delete' 연산자를 사용하여 해제합니다.
    • new: 동적으로 메모리를 할당하는데 사용되는 연산자로, 객체나 배열 등을 생성할 때 사용됩니다. new로 할당된 메모리는 반드시 직접 해제해야 합니다.
    • delete: new로 할당된 메모리를 해제하는데 사용되는 연산자입니다. 메모리를 사용한 후 반드시 delete로 해제해야 메모리 누수를 방지할 수 있습니다.


RAII(Resource Acquisition Is Initialization)

 

RAII는 C++의 중요한 디자인 패턴 중 하나로, 자원의 할당과 해제를 객체의 생성과 소멸과 직접적으로 연결합니다. 객체가 생성될 때 자원을 할당하고, 객체가 소멸될 때 자원을 해제하는 방식을 따릅니다. 이를 통해 자원 관리를 안전하고 예측 가능하게 처리할 수 있습니다.


스마트 포인터 (Smart Pointer)

 

스마트 포인터는 RAII를 구현한 클래스로, 동적으로 할당한 메모리를 자동으로 관리해줍니다. 주로 'shared_ptr', 'unique_ptr', 'weak_ptr'이 있으며, 각각 참조 카운팅, 소유권 전달, 약한 참조를 지원합니다. (스마트 포인터는 중요해서 다음 포스팅에 자세히 다루겠습니다.)

728x90

'C++' 카테고리의 다른 글

C++ 가상 함수 (Virtual Functions) 이해하기  (0) 2023.10.06
스마트 포인터(smart pointer)  (0) 2023.07.31