C++ でのガベージ コレクション
この記事では、C++ でのガベージ コレクションについて学習します。
メモリ管理手法としてのガベージ コレクション
ガベージ コレクションは、プログラミング言語で使用されるメモリ管理手法の 1つです。 これは、多くのプログラミング言語の機能として追加された自動メモリ管理手法です。
ガベージ コレクタは、変数またはオブジェクトに割り当てられたが、プログラムによって使用されなくなったメモリを収集または再利用します。 これはガベージとも呼ばれます。
注意すべきことの 1つは、ガベージ コレクターはメモリやファイルなどのリソースのみを管理することです。 UI ウィンドウとデストラクタは処理されません。
Java、C# などの言語、およびほとんどのスクリプト言語には、効率を高めるために言語の一部としてガベージ コレクションがあります。
しかし、C++ のような言語では、手動のメモリ管理があります。つまり、プログラマは、new,
、delete,
、または何らかのアルゴリズムなどのコマンドを使用して手動で行う必要があります。
C++ での手動メモリ管理
動的メモリ割り当ては、実行時に ヒープ
領域に割り当てられるメモリのタイプです。 そのメモリの使用を停止したら、解放する必要があります。 そうしないと、メモリ リークが発生する可能性があります。
C++ でのメモリ割り当てと割り当て解除は、new
や delete.
などのコマンドを使用して手動で行われます。 new
キーワードは、メモリをヒープから動的に割り当てます。
使用が完了したら、delete
キーワードを使用してメモリの割り当てを解除し、クリアします。 内部的には、destructor
を呼び出してメモリを破棄します。
したがって、メモリーリークを避けるために、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++ での手動メモリ管理に関する問題
大きな問題の 1つは、delete,
の使用を忘れて、メモリ リークが発生する可能性があることです。 2 番目の大きな問題は、大量の動的メモリ割り当てが発生する大規模なプログラムを扱う場合、既に使用されているメモリを誤って割り当て解除する可能性があることです。
ガベージ コレクションのアルゴリズム
マーク アンド スイープ
、コピー
、参照カウント
などのさまざまなガベージ コレクション アルゴリズムを使用できるため、特に C++ などの言語のプログラムでは、ガベージ コレクションと手動メモリ管理を同時に行うことができます。
参照カウントは、参照カウント
アルゴリズムの各動的メモリ割り当てに関連付けられています。 参照カウントは、新しい参照が作成されると増加し、参照が削除されると減少します。
このカウントが 0 になると、メモリが使用されなくなったことを意味し、メモリを解放できます。