2012-02-09 3 views
0

私は自分自身にC++を教えてくれていて、誰かがC++にガベージコレクターがないと言ってくれました。今私はこれがどれほど意味するかは分かりません。C++メモリーgarbaging

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"?

+9

あなたは良いC++の初心者の本を入手し、それを読む必要があります。ガベージコレクションは、ヒープ上で作成されたもの(C++で 'new'を使用)と関係しています。あなたの例の中のすべてがスタックにあります。あなたが包囲関数を離れると、それは存在しなくなります。 –

+0

C++では、 'main'は' int main() 'のように' int main(int argc、char * argv []) 'または' none 'のような2つの引数をとります。 –

+0

¤C++には*標準の*ガベージコレクタが1つありません。しかし、 [Boehmコレクター](http://en.wikipedia.org/wiki/Boehm_collector)。しかし、それはあなたがしていることを本当に知ることからあなたを救うものではありません。サンプルプログラムには動的割り当てがないため、ガベージコレクションは不要です。乾杯&乾杯。 –

答えて

5

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

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

動的割り当ては、new演算子を使用して作成するものです。それらは自動的にクリーンアップされません - あなたはdeleteにする必要がありますか、それらが漏れます。 (スマートポインタを使用してください)

2

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

0

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

オブジェクトはあなたの例では、そのスコープで区切られた寿命を有し、resultmultiply内に構築され、その後、resultのコピーは、それが再びメインにresultにコピーされmain、に返されます。

multiplyの範囲の末尾には、resultが破壊され、それを保持するメモリが解放されます。

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

1

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

つまり、プログラム例ではリソースリークがありません。

2

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

コードを使用すると問題ありません。あなたは

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も参照してください。

1

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

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

主な理由は速度です:スタックベースの割り当てロジックを使用する方が、フリーストアを使用するよりも高速です(現在のプロセッサではスタックに多数の変数を割り当てるだけで、加算が1回必要で、

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

実際にはC++メモリ管理はこの説明より複雑です(例外オブジェクトが格納されているメモリもありますが、クラスのカスタムアロケータがあり、コンテナのアロケータパラメータがあります)。プログラマはそれを考慮する必要はほとんどありません。