인강 & 책 스터디 노트/Coursera 가속화된 컴퓨터 과학 기초

[c++] 힙 메모리(Heap Memory)

thisisamrd 2024. 7. 31.

힙 메모리는 함수의 생명 주기와 독립적으로 메모리를 할당할 수 있도록 해주는 중요한 개념입니다.

 

 

c++

 

힙 메모리(Heap Memory)

힙 메모리는 프로그램이 실행되는 동안 동적으로 메모리를 할당할 수 있는 메모리 영역입니다. 함수의 생명 주기와 관계없이 메모리를 할당하거나 해제할 수 있습니다. 힙 메모리는 newdelete 키워드를 사용합니다. 또한 힙 메모리는 낮은 주소에서 시작해서 높은 주소로 증가합니다.

 

 

힙 메모리 할당 

- new 키워드를 사용하여 힙 메모리를 할당하며, new 키워드는 메모리 주소를 가리키는 포인터를 반환합니다.

int *numPtr = new int; // 힙 메모리에 정수형 변수를 할당하고 그 주소를 numPtr에 저장

 

 

 

힙 메모리 해제

- delete 키워드를 사용하여 힙 메모리에 할당된 메모리를 해제할 수 있습니다.

delete numPtr; // 힙 메모리에 할당된 메모리를 해제

 

 

포인터와 힙 메모리 

- 힙 메모리에 할당된 메모리는 포인터를 통해 접근할 수 있습니다.

- 포인터는 힙 메모리의 주소를 저장하고, 역참조 연산자 * 를 사용하여 해당 주소의 값을 읽거나 쓸 수 있습니다.

 

#include <iostream>

int main() {
    int *numPtr = new int;  // 힙 메모리에 정수형 변수 할당
    *numPtr = 42;           // 포인터를 통해 힙 메모리의 값 설정

    std::cout << "Value pointed to by numPtr: " << *numPtr << std::endl;  // 힙 메모리의 값 출력
    std::cout << "Address of numPtr: " << numPtr << std::endl;            // 힙 메모리의 주소 출력
    std::cout << "Address of numPtr variable: " << &numPtr << std::endl;  // 포인터 자체의 주소 출력

    delete numPtr;  // 힙 메모리 해제
    numPtr = nullptr;  // 포인터를 nullptr로 설정하여 더 이상 사용되지 않음을 표시

    return 0;
}

 

위 코드의 실행 결과는 아래와 같습니다.

 

출력 설명

힙 메모리의 값 출력

std::cout << "Value pointed to by numPtr: " << *numPtr << std::endl;

 

이 줄은 포인터가 가리키는 힙 메모리의 값을 출력합니다. *numPtr은 '42'로 설정되었으므로 출력 결과는 42입니다.

 

 

힙 메모리 주소 출력

std::cout << "Address of numPtr: " << numPtr << std::endl;

 

이 줄은 numPtr 포인터 자체의 값을 출력합니다. numPtr는 힙 메모리에 할당된 정수형 변수의 주소를 가리키므로, 이는 메모리 주소가 될 것입니다. (ex. 0x55b1ad2e7000)

이는 상대적으로 작은 값일 가능성이 높습니다. 왜냐하면 힙 메모리는 낮은 주소에서 시작해서 높은 주소로 증가하기 때문입니다.

 

 

포인터 변수의 주소 출력 

std::cout << "Address of numPtr variable: " << &numPtr << std::endl;

 

이 줄은 numPtr 포인터 변수 자체의 메모리 주소를 출력합니다. &numPtr는 numPtr 포인터 변수가 스택 메모리에 저장된 위치를 나타냅니다.(ex. 0x7ffee4b3c8f8) 

이는 상대적으로 큰 값일 가능성이 높습니다. 스택 메모리는 높은 주소에서 시작해서 낮은 주소로 증가하기 때문입니다.

 

 

 

 

 

메모리 해제와 널 포인터 

delete numPtr;  // 힙 메모리 해제
numPtr = nullptr;  // 포인터를 nullptr로 설정하여 더 이상 사용되지 않음을 표시

 

 

  • delete numPtr;는 힙 메모리에 할당된 메모리를 해제합니다
  • numPtr = nullptr;는 numPtr 포인터를 nullptr로 설정하여 더 이상 유효한 메모리 주소를 가리키지 않음을 표시합니다.

 

댓글