스택 vs 힙 메모리
Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 104개 중 12번째.
C++ 프로그램은 두 가지 주요 메모리 영역인 스택과 heap을 사용합니다. 객체가 어디에 존재하는지 이해하는 것은 효율적이고 버그가 없는 코드를 작성하는 데 매우 중요합니다.
스택은 빠른 자동 메모리입니다. 함수 내부에서 선언된 변수는 이곳에 존재하며, 범위를 벗어나면 automatically 소멸됩니다.
void example() {
int x = 10; // 스택 할당
Player player; // 스택 할당 - 자동으로 소멸됨
} // x와 player는 여기서 소멸됩니다heap은 더 크지만 더 느린 memory이며, 이를 수동으로 관리합니다. heap의 객체는 명시적으로 delete할 때까지 유지됩니다.
void example() {
Player* player = new Player(); // 힙 할당
// player는 삭제될 때까지 존재함
delete player; // 수동 정리 필요
}주요 차이점:
| Stack | Heap |
|---|---|
| 빠른 할당 | 더 느린 할당 |
| 제한된 크기 | 대용량 |
| 자동 정리 | 수동 정리 필요 |
| 고정 크기 객체 | 동적 크기 객체 |
작고 수명이 짧은 객체에는 stack allocation을 사용하세요. 객체가 해당 범위를 넘어 살아 있어야 하거나 크기가 런타임에 결정되는 경우에는 heap allocation을 사용하세요.
heap 메모리를 delete하는 것을 잊으면 C++ 프로그램에서 버그의 흔한 원인인 memory leaks가 발생합니다.
챌린지
쉬움객체가 어떻게 생성되고 소멸되는지 추적하는 간단한 Counter class를 만들어 스택과 힙 memory의 차이를 살펴보겠습니다.
코드를 구성하기 위해 두 개의 파일을 만듭니다:
Counter.h: privatenameattribute를 가진Counterclass를 define합니다. 이름을 인수로 받고"Creating: <name>"을 prints하는 constructor와"Destroying: <name>"을 prints하는 destructor를 포함합니다. counter의 이름을 return하는getName()method를 추가합니다.main.cpp: 스택과 힙 allocation을 모두 보여 줍니다. input에서 이름을 Read한 다음:- 해당 이름을 사용하여 스택에 allocated된
Counter를 Create합니다 "HeapCounter"라는 이름으로 힙에 allocated된Counter를 Create합니다- 두 counter 이름을
"Stack: <name>"및"Heap: <name>"format으로 Print합니다 - memory leak을 prevent하기 위해 힙에 allocated된 counter를 delete합니다
- 해당 이름을 사용하여 스택에 allocated된
각 객체를 언제 Create하고 delete하는지에 따라 constructor와 destructor 메시지가 서로 다른 순서로 나타나는 것을 확인하세요. 스택 객체는 main()이 끝날 때 automatically destroyed되지만, 힙 객체는 명시적으로 delete해야 합니다.
#include "Counter.h"를 사용하여 main.cpp에 header file을 include하세요.
직접 해보기
#include <iostream>
#include <string>
#include "Counter.h"
using namespace std;
int main() {
// 입력에서 이름 읽기
string inputName;
cin >> inputName;
// TODO: inputName을 사용하여 스택에 할당된 Counter 생성
// TODO: 이름이 "HeapCounter"인 힙에 할당된 Counter 생성
// TODO: Print stack counter name in format "Stack: <name>"
// TODO: 힙 카운터 이름을 "Heap: <name>" 형식으로 출력
// TODO: 메모리 누수를 방지하기 위해 힙에 할당된 카운터 삭제
return 0;
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C++ 컴파일러