C++의 가비지 컬렉션
이 기사에서는 C++의 가비지 수집에 대해 알아봅니다.
메모리 관리 기술로서의 가비지 컬렉션
가비지 컬렉션은 프로그래밍 언어에서 사용되는 메모리 관리 기술 중 하나입니다. 많은 프로그래밍 언어에 기능으로 추가된 자동 메모리 관리 기술입니다.
가비지 수집기는 변수 또는 개체에 할당된 메모리를 수집하거나 회수하지만 프로그램에서 더 이상 사용하지 않습니다. 이것은 쓰레기라고도합니다.
한 가지 유의할 점은 가비지 수집기는 파일과 같은 리소스 또는 메모리만 관리한다는 것입니다. UI 창과 소멸자는 처리되지 않습니다.
Java, C# 및 대부분의 스크립팅 언어와 같은 언어에는 효율성 향상을 위해 언어의 일부로 가비지 수집 기능이 있습니다.
그러나 C++와 같은 언어에는 수동 메모리 관리가 있습니다. 즉, 프로그래머가 new,
, delete,
또는 일부 알고리즘과 같은 명령을 사용하여 수동으로 메모리 관리를 수행해야 합니다.
C++의 수동 메모리 관리
동적 메모리 할당은 런타임 동안 힙
영역에 할당되는 메모리 유형입니다. 그 메모리 사용을 중단하면 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생할 수 있습니다.
C++에서 메모리 할당 및 할당 해제는 new
또는 delete.
와 같은 명령을 사용하여 수동으로 수행됩니다. new
키워드는 힙에서 동적으로 메모리를 할당합니다.
사용이 완료되면 delete
키워드를 사용하여 메모리 할당을 해제하고 지웁니다. 내부적으로는 소멸자
를 호출하여 메모리를 파괴합니다.
따라서 메모리 누수를 방지하기 위해 new
뒤에는 항상 delete
명령이 와야 합니다.
예제 코드:
#include <bits/stdc++.h>
using namespace std;
int main() {
int *arr = new int[5]; // 5 blocks of memory allocated
if (!arr)
cout << "Memory allocation failed\n";
else {
for (int i = 0; i < 5; i++) arr[i] = i + 1;
cout << "Value stored in memory blocks ";
for (int i = 0; i < 5; i++) cout << arr[i] << " ";
}
delete[] arr; // deallocates the block of memory
}
출력:
Value stored in memory blocks 1 2 3 4 5
C++의 수동 메모리 관리 문제
한 가지 중요한 문제는 delete,
를 사용하는 것을 잊어버려 메모리 누수가 발생할 수 있다는 것입니다. 두 번째 주요 문제는 많은 동적 메모리 할당이 발생하는 광범위한 프로그램을 처리할 때 이미 사용 중인 메모리를 실수로 할당 해제할 수 있다는 것입니다.
가비지 수집 알고리즘
특히 C++과 같은 언어의 프로그램에서 가비지 수집과 수동 메모리 관리를 동시에 수행할 수 있도록 마크 및 스윕
, copy
및 참조 카운팅
과 같은 다양한 가비지 수집 알고리즘을 사용할 수 있습니다.
참조 카운트는 참조 카운팅
알고리즘의 각 동적 메모리 할당과 연관됩니다. 참조 횟수는 새로운 참조가 생성되면 증가하고 참조가 삭제되면 감소합니다.
이 수가 0에 도달하면 메모리가 더 이상 사용되지 않으며 해제할 수 있음을 나타냅니다.