0

重複の可能性:
C ++での適切なスタックとヒープの使用?
ヒープとスタックの割り当て

JavaからC++に移植したライブラリ(コンバーターを使用した後の長くて骨の折れる編集作業)がメモリを解放せず、クラッシュするまで仮想メモリを爆発させる理由を理解しようとしています。明らかに、これはJavaがGCを持ち、C ++がないことと関係があります-そして、アルゴリズムはC++にかなりまっすぐに変換されます。

これが私の質問です。割り当てられたメモリをどこでどのように削除しますか(解放します)?私が持っているとき:

Matrix *mat = new Matrix(args);

明らかに、スコープを。で終了する必要がありdelete mat;ます。これを回避できますか?使用Matrix mat(args);する方が良いでしょうか?メモリの割り当てと解放の観点から?または使用していMatrix mat = Matrix(args)ますか?

4

3 に答える 3

2

割り当てられたメモリをどこでどのように削除しますか?(解放する)

ほとんどの場合、適切にコーディングすれば、メモリを明示的に解放したり、割り当てを解除したりする必要はありません。自動割り当てまたはスマートポインタのいずれかを使用します。そうでなければ、どこへの答えはかなり満足のいくものではありません:あなたが必要とするところはどこでも、あなたのプログラムに依存します。方法に対する答えはより単純です:with delete(またはdelete[]動的に割り当てられた配列の場合)。

...明らかにスコープを削除マットで終了する必要があります。これを回避できますか?

はい、自動割り当てを使用する場合:

Matrix mat(args);

原則として、本当に必要な場合にのみ、動的に割り当てられたオブジェクトを使用する必要があります。本当に必要かどうかわからない場合は、おそらく必要ありません。

...またはMatrixmat= Matrix(args);を使用します。

これにより、コピーの初期化が実行されます。このコンテキストでは、に勝る利点はありませんMatrix mat(args);。式のRHSは一時Matrixオブジェクトであり、LHSをコピー構築するために使用されますmat

これが最近の関連記事です。

于 2012-09-23T07:21:43.967 に答える
1

オブジェクトを作成した範囲を超えて存続させたくない場合は、2番目のオプションの方が適しています。

オブジェクトを明示的に記憶する必要がある動的メモリオプションとは異なり、スコープが終了すると、オブジェクトの割り当てが自動的に解除されdeleteます。

良い読み物:

C ++プログラマーが「new」の使用を最小限に抑える必要があるのはなぜですか?

于 2012-09-23T07:21:01.480 に答える
0

C /C++でメモリ割り当てがどのように機能するかを本当に理解する必要があります。
質問はC++の経験があまりないことを示唆しているので、それについての本から始めることをお勧めします。
当面の問題:
Matrix *mat = new Matrix(args); ここでMatrixは、ヒープ上にオブジェクトを作成します。つまり、スコープにバインドされていません(もちろん、ポインターはバインドされています)。を使用してオブジェクトを解放するのはユーザーの責任deleteです。
Matrix mat(args);-ここで、スタック上にオブジェクトを作成します。オブジェクトはスコープが終了すると破棄されます。これは、プリミティブ型を除いてJavaでは使用できません。
パフォーマンスに関しては、スタック上にオブジェクトを作成する方が安全(自動破棄)であるだけでなく、はるかに高速です。空きブロックを検索する必要がないという事実に加えて、スタックメモリが事前に割り当てられています。
ヒープからメモリを作成する場合、プロセスは仮想メモリマネージャにメモリを要求することになり、パフォーマンスに大きな打撃を与えます。
とは言っても、どのような種類の割り当てにも時間と場所があり、自分のコードに適したものを使用する必要があります。これを行う「正しい方法」はありません。

于 2012-09-23T07:32:55.330 に答える