힙 메모리는 함수의 생명 주기와 독립적으로 메모리를 할당할 수 있도록 해주는 중요한 개념입니다.
힙 메모리(Heap Memory)
힙 메모리는 프로그램이 실행되는 동안 동적으로 메모리를 할당할 수 있는 메모리 영역입니다. 함수의 생명 주기와 관계없이 메모리를 할당하거나 해제할 수 있습니다. 힙 메모리는 new와 delete 키워드를 사용합니다. 또한 힙 메모리는 낮은 주소에서 시작해서 높은 주소로 증가합니다.
힙 메모리 할당
- 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로 설정하여 더 이상 유효한 메모리 주소를 가리키지 않음을 표시합니다.
'인강 & 책 스터디 노트 > Coursera 가속화된 컴퓨터 과학 기초' 카테고리의 다른 글
[C++] 복사 생성자와 복사 대입 연산자의 차이점 (0) | 2024.08.05 |
---|---|
[c++] 클래스 생성자 - 자동 디폴트 생성자, 사용자 지정 생성자 (0) | 2024.08.04 |
[c++] 스택 메모리, 포인터 (0) | 2024.07.30 |
[C++] iostream 라이브러리, 네임스페이스, using 키워드 (0) | 2024.07.30 |
코세라 Coursera Accelerated Computer Science Fundamentals 강의 시작 (0) | 2024.07.29 |
댓글