0

私は独学で C++ を学んでいますが、C++ にはガベージ コレクターがないと誰かに言われました。これがどの程度のことを意味するのかは、今となってはわかりません。

私はこのコードを持っているとしましょう:

double multiply (double a, double b) {
    double result = a * b;
    return result;
};
int main (char* args[]) {
    double num1 = 3;
    double num2 = 12;
    double result = multiply(num1, num2);
    return 0;
}

乗算メソッドには、内部変数「result」が含まれています。変数「結果」のメモリアドレスはまだ割り当てられているか、ロックされていますか?パラメータ「a」と「b」はどうですか?

4

6 に答える 6

5

標準 C++ にはガベージ コレクタがまったくありません。

ただし、自動変数 (「スタック」変数) は、スコープが終了するとクリーンアップされ、必要に応じてデストラクタが呼び出されます。(例のすべての変数は自動です。)

心配しなければならないのは、動的割り当てです。つまり、newオペレーターを介して作成するものです。それらは自動的にクリーンアップされません-必要が deleteあるか、リークします。(または、スマート ポインターを使用します。)

于 2012-02-09T06:49:24.520 に答える
2

あなたが言及したすべての変数はスタックにあります。それらが範囲外になると、メモリは自動的に解放されます。

于 2012-02-09T06:48:22.623 に答える
2

ガベージ コレクションとは、ガベージ (ヒープ上のアクセス可能/参照されていないメモリ) が自動的に解放されることを意味します。ローカル メモリ/変数 (ローカル変数) は割り当てられませんが、変数を定義したブロックを離れるとスタックにプッシュされ、自動的に解放されます。

したがって、コードを使用すれば問題ありません。しかし、あなたが使用する場合

double multiply (double a, double b) {
    double *result = new double;
    *result = a * b;
    return *result;
};

その後、メモリresultはまだ割り当てられ、「ロック」され、失われます。http://en.wikipedia.org/wiki/Call_stackおよびhttp://en.wikipedia.org/wiki/Dynamic_memory_allocation#Dynamic_memory_allocationも参照してください。

于 2012-02-09T06:49:44.990 に答える
1

C++ には、オブジェクトが割り当てられる主なメモリ タイプが 2 つあります。スタックとフリー ストア (ヒープ) です。スタック上のオブジェクトは、手動で割り当ておよび割り当て解除されます。これには、関数パラメーター、自動 (ローカル) 変数、一時オブジェクト、戻り値が含まれます。フリー ストア (ヒープ) 上のオブジェクトは、代わりにnewnew[]deleteおよびで明示的に管理されdelete[]ます。malloc/freeまたは派手な名前の関数operator newoperator deleteそれに対応する関数を使用して、フリー ストアから生メモリを管理することもできます[]

C++ のフリー ストアで管理されるオブジェクトの場合、割り当てと解放を処理するのはプログラマの責任です。他の言語では、これは代わりに自動的に行われます。C ++でも、スタックベースのオブジェクトの有効期間がスコープにバインドされていることに注意する必要があります(たとえば、ローカル変数のアドレスを保存または返すことは一般的なエラーであり、多くのバグの原因です)が、これも問題ではありません他の言語で。

この複雑さの主な理由は速度です。スタック ベースの割り当てロジックを使用すると、フリー ストアを使用するよりもはるかに高速です (現在のプロセッサでは、スタックに多くの変数を割り当てるには、単純に 1 つの加算とそれらの割り当て解除を行うだけです)。

他の言語では、コンパイラがコードを分析し、スタック割り当てを使用できる場所と使用できない場所を決定しますが、C++ ではこれはプログラマーの仕事です。

C++ では、メモリ管理は実際にはこの説明よりも少し複雑であることに注意してください (たとえば、例外オブジェクトが格納されるメモリもあり、クラス用のカスタム アロケータがあり、コンテナ用のアロケータ パラメータがあります)、プログラマが必要とすることはめったにありません。それを検討します。

于 2012-02-09T07:00:24.503 に答える
1

実際、C++ はリソース管理に非常に優れています。ヒープに割り当てられたオブジェクトのガベージ コレクションは行いません。当然のことながら、ヒープに何も割り当てていません。多くの場合、それを行う場合、おそらく明示的には行いません (たとえば、 を使用する場合std::vector<T>)。他の言語でガベージ コレクションによって処理されるリソース リークを取得するには、 を使用してヒープにオブジェクトを割り当てますnew。すべてのメモリ割り当て (実際にはすべてのリソース割り当て) を対応するリリースとペアにする必要があります。std::vector<T>やのようなものを使用するstd::shared_ptr<T>と、C++ で大量のリソース リークが発生します。

つまり、サンプル プログラムにはリソース リークがありません。

于 2012-02-09T06:48:50.760 に答える
0

C++ にガベージ コレクタがないことは (ほとんどの場合、外部ライブラリを無視して) 真実です。代わりに、自動保存期間の概念があります。

スコープ内のオブジェクトには、そのスコープによって区切られた有効期間があります。例でresultは、 内で構築されmultiply、 のコピーresultが に返されmain、そこで再びresultメインにコピーされます。

のスコープの最後でmultiplyresultが破棄され、それを保持していたメモリresultが解放されます。

この「自動メモリ管理」はガベージ コレクタを使用せず、完全に決定論的です。

于 2012-02-09T06:48:27.953 に答える