C++ には、オブジェクトが割り当てられる主なメモリ タイプが 2 つあります。スタックとフリー ストア (ヒープ) です。スタック上のオブジェクトは、手動で割り当ておよび割り当て解除されます。これには、関数パラメーター、自動 (ローカル) 変数、一時オブジェクト、戻り値が含まれます。フリー ストア (ヒープ) 上のオブジェクトは、代わりにnew
、new[]
、delete
およびで明示的に管理されdelete[]
ます。malloc
/free
または派手な名前の関数operator new
とoperator delete
それに対応する関数を使用して、フリー ストアから生メモリを管理することもできます[]
。
C++ のフリー ストアで管理されるオブジェクトの場合、割り当てと解放を処理するのはプログラマの責任です。他の言語では、これは代わりに自動的に行われます。C ++でも、スタックベースのオブジェクトの有効期間がスコープにバインドされていることに注意する必要があります(たとえば、ローカル変数のアドレスを保存または返すことは一般的なエラーであり、多くのバグの原因です)が、これも問題ではありません他の言語で。
この複雑さの主な理由は速度です。スタック ベースの割り当てロジックを使用すると、フリー ストアを使用するよりもはるかに高速です (現在のプロセッサでは、スタックに多くの変数を割り当てるには、単純に 1 つの加算とそれらの割り当て解除を行うだけです)。
他の言語では、コンパイラがコードを分析し、スタック割り当てを使用できる場所と使用できない場所を決定しますが、C++ ではこれはプログラマーの仕事です。
C++ では、メモリ管理は実際にはこの説明よりも少し複雑であることに注意してください (たとえば、例外オブジェクトが格納されるメモリもあり、クラス用のカスタム アロケータがあり、コンテナ用のアロケータ パラメータがあります)、プログラマが必要とすることはめったにありません。それを検討します。