C++/입문편

8강. 실행중인 프로그램의 메모리 공간을 살펴보자 (데이터, 스택, 힙, malloc & free)

쉽코딩 2023. 1. 22.

 

 

 

메모리

 

 

메모리 공간

C++에서 메모리는 데이터가 저장되고 컴퓨터 프로그램에 의해 조작되는 물리적 공간을 의미합니다. 메모리는 기본 메모리(RAM이라고도 함)와 보조 메모리(예: 하드 드라이브 및 플래시 드라이브)의 두 가지 주요 범주로 나눌 수 있습니다.

기본 메모리는 운영 체제와 실행 중인 프로그램이 저장되고 실행되는 컴퓨터의 기본 메모리입니다. 휘발성이므로 전원이 꺼지면 저장된 데이터가 손실됩니다. 기본 메모리의 크기는 제한되어 있으며 일반적으로 기가바이트(GB) 단위로 측정됩니다.

반면 보조 메모리는 비휘발성이며 현재 사용하지 않는 데이터와 프로그램을 저장하는 데 사용됩니다. 보조 메모리의 크기는 일반적으로 테라바이트(TB) 또는 페타바이트(PB) 단위로 측정됩니다.

C++에서 메모리 관리는 프로그램 실행 중에 동적으로 메모리를 할당 및 할당 해제하는 프로세스입니다. C++ 표준 템플릿 라이브러리(STL)는 동적 메모리 할당을 위해 벡터, 목록 및 맵과 같은 여러 클래스를 제공합니다. new 및 delete 연산자를 사용하여 C++에서 메모리를 동적으로 할당 및 할당 해제할 수도 있습니다.

또한 C++에서는 포인터가 가리키는 메모리를 자동으로 관리하는 일종의 포인터인 스마트 포인터를 사용할 수 있습니다. 스마트 포인터는 원시 포인터의 대안이며 메모리 할당 및 할당 해제를 자동으로 처리하여 메모리 누수 및 기타 메모리 관련 오류를 방지하는 데 도움이 됩니다.

버퍼 오버플로, 범위를 벗어난 액세스, 해제 후 사용과 같은 메모리 오류는 일반적이며 보안 취약성을 유발할 수 있으므로 C++ 프로그램에서 메모리가 어떻게 사용되고 있는지 인식하는 것이 중요합니다. 이러한 유형의 오류를 방지하기 위해 적절한 조치를 취하십시오.

 

 

스택, 힙, 정적 및 전역

C++에서 메모리는 데이터와 변수를 저장하는 데 사용되며 스택, 힙 및 정적/전역의 세 가지 주요 범주로 나눌 수 있습니다.

  • 스택: 스택은 함수 호출 프레임 및 로컬 변수와 같은 임시 데이터를 저장하는 데 사용되는 메모리 영역입니다. 스택은 운영 체제에서 관리하며 일반적으로 메모리 공간의 맨 위에 있습니다. 스택 메모리는 시스템에 의해 자동으로 할당 및 할당 해제되며 빠르고 효율적이지만 크기가 제한됩니다.

  • 힙: 힙은 동적 메모리 할당을 저장하는 데 사용되는 메모리 영역입니다. 일반적으로 메모리 공간의 맨 아래에 있습니다. 힙은 운영 체제가 관리하지 않고 프로그래머가 관리하며 메모리는 new 및 delete 또는 malloc 및 free와 같은 기능을 사용하여 할당 및 할당 해제됩니다. 힙 메모리는 스택 메모리보다 유연하지만 느리고 오류가 발생하기 쉽습니다.

  • 정적/전역: 함수 외부에서 정의되고 프로그램 실행 내내 해당 값을 유지하는 변수입니다. 정적/전역 변수에 대한 메모리는 프로그램 로딩 중에 할당되고 프로그램 종료 중에 할당 해제됩니다.

  • malloc() 및 free()에 대해 이야기할 때 이들은 힙에서 메모리를 할당 및 할당 해제하는 C 함수입니다. malloc() 함수는 주어진 크기의 메모리를 동적으로 할당하는 데 사용되며 할당된 메모리의 첫 번째 바이트에 대한 void 포인터를 반환합니다. free() 함수는 이전에 할당된 메모리를 할당 해제하는 데 사용됩니다. 

 

예를 들면 다음과 같습니다.

#include <stdlib.h>

int main() {
    int* ptr = (int*)malloc(sizeof(int));
    *ptr = 5;
    printf("%d", *ptr);
    free(ptr);
    return 0;
}

이 프로그램은 정수에 대한 메모리를 동적으로 할당하고 값 5를 할당하고 인쇄합니다. 그런 다음 free() 함수를 사용하여 메모리 할당을 해제합니다.

C++에서 new 연산자를 사용하면 내부적으로 malloc() 함수를 호출하고 delete 연산자를 사용하면 내부적으로 free() 함수를 호출한다는 점은 주목할 가치가 있습니다.

오류를 피하고 C++ 프로그램의 성능을 최적화하려면 스택 메모리와 힙 메모리의 차이점과 malloc, free 또는 new 및 delete를 사용하는 시기와 작동 방식을 이해하는 것이 중요합니다.

 

8.1강 보충 설명을 통해 조금 더 자세히 알아보겠습니다. 

 

댓글