2012-01-31 20 views
3

私はC++デストラクタを作成しています(これは適切な用語ですが、私はC++を初めて使用しています)、ガベージコレクションに必要なもの。インスタンス変数として2つのポインタを持っていて、それらをガベージコレクションする必要があるとしましょう。インスタンス変数としてオブジェクトがあるとどうなりますか?またはオブジェクトへのポインタですか?C++デストラクタでガベージコレクションを行うにはどうすればいいですか?

私はちょうど削除が必要なものと自動的にクリーンアップされるものについて少し不明です。あなたはゴミに必要

おかげ

+8

Pedantic note:C++では「ガベージコレクト」しません。あなたはそれらを削除します。 –

+0

C++にはガベージコレクタがありません。あなたは1つを書き込もうとしていますか、あるいはデストラクタのオブジェクトを削除しようとしていますか?そしてなぜスマートポインタを使用していないのですか? –

+0

もしあなたが他の言語から来たのであれば、C++デストラクタのコンセプトは、あなたが汚れていることを意味します。あなたはそれについて不注意にすることはできません。 – linuxeasy

答えて

11

newを呼び出した場合の経験則は、deleteです。 new[]を呼び出した場合は、delete[]に電話してください。クラス外でこれらのポインタにアクセスし、それらを効果的に共有している場合、共有オブジェクトがまだ使用されている間は、オブジェクトを所有していることに注意してください。ガベージコレクションは、適切な用語ではありません。オブジェクトはdestroy、メモリはfreeになります。これはdelete/delete[]です。 new/new[]メモリを割り当て、constructオブジェクトを割り当てます。

C++では、ガベージコレクタがありません。あなたはそれを "手動で"扱わなければなりません。それはすべて退屈だと言っているわけではありません。おそらくスマートポインタを使用して、このロジックの一部を処理します。詳細は、this questionを参照してください。

+0

所有権を述べた唯一の答えです。 +1! –

+0

オブジェクトへのポインタをインスタンスフィールドとして持っていて、誰もそれについて知っていないと仮定しようとすると、オブジェクトを削除する必要がありますがポインタは削除する必要があります...正しいのですか? – Nosrettap

+0

構文は 'delete Address'の行に沿っています。ポインタは事実上、オブジェクトのメモリ内にアドレスを格納する何らかのデータである。したがって、 'int * Number;'を持っているなら、 'Number'が指すものを削除するには' delete Number; 'を使うべきです。ポインタ自体は削除するのではなく、ポインタが指すものを削除しています。構文は単にアドレスを求め、ポインタはアドレスを格納します。 –

0

あなたは、もはや必要はないんすべてのポインタを集めます。そうしなければ、ぶら下がったポインタの問題が発生します。

+3

C++にガベージコレクションがありません。質問をした人のように混乱しています。 –

+1

これはぶら下がったポインタではなく、メモリリークです。あなたがそれを解放し、それを使用しようとすると何が起こるかは、ぶら下がっているポインタです。 – Dan

+0

そのメモリリーク!、あなたが削除してからそれにアクセスしようとするとぶら下がっている! – linuxeasy

2

新しい演算子を使用して割り当てたメモリはすべて解放する必要があります。

あなたが実行してメモリを割り当てる:

int * p1 = new int[5]; 
p2 = new int; 

を、あなたがやってそれを削除します。あなたはクラスで遊んでいる場合は

delete[] p1 
delete p2; 

を、あなたは、コンストラクタで同じことを行う必要があります(割り当て)デストラクタ(デアロケート)。

3

あなたがnewで割り当てるすべてのポインタdeleteする必要があります。それは単純で、それは複雑です。 deleteがあるまで、newによって割り当てられたポインタのトラックを失わないでください。

また、new[]を使用してポインタを割り当てる場合は、delete[]を呼び出して割り当てを解除する必要があります。

これは、クラスインスタンスでどのようなポインタが発生したかについてのものではありません。 の所有者であることを知る必要があります(所有者は、削除の責任者です)。あなたのオブジェクトがそれらのポインタを所有している場合は、それを削除する必要があります。それを所有していない場合は、そうではありません。

これは経験豊富なC++プログラマが可能であれば裸のポインタを避ける理由です。スマートポインタを使用すると、言語で意味的に所有権タイプを表現できます。そうすれば、誰が何を所有しているかを把握する必要はありません。使用されているスマートポインタのタイプによって誰が所有しているかが分かります。

+0

'new'、' new [] '、' delete'、 'delete [] 'の違いを言及したいかもしれません。 –

2

理想的な世界では、何もありません。すべてのパターンにスマートポインタとコンテナがあります。場合によっては、自分で作成するか、既存の実装を補強する必要がありますが、必要なものの多くはすでに存在しています。

アレイの場合は、std::arraystd::vectorで始まります。オブジェクトの場合は、スマートポインタと共有ポインタを読み込みます。 一般化deletedelete[]またはfreeに電話する必要がある場合は、通常は間違った経路に向かっています。

3

あなたはmallocを使用してしまったすべてのものにあなたがnew[]を使用して作成されたすべての領域にnewdelete[]を使用して作成されたすべての空間上delete、およびfreeを呼び出す必要があります。

また、開いたソケットを閉じて、自分のクラスが所有する他のOSリソースをすべてクリアする必要があります。

注:ガベージコレクションとは呼ばれません。ガベージコレクションは、このプロセスがライブラリやランタイムの一部として自動的に行われ、明示的に実行されないときに発生します。

3

"リソース獲得は初期化"(RAII)とスマートポインタ(shared_ptrunique_ptr)について学習することから始めます。これはイディオムで、C++で知っておく必要があります。

通常の方法では、コンストラクタで割り当てたものは、デストラクタで割り当て解除する必要があります(他の方法の解説を参照)。イベントはできるだけ少なく、可能な限り値を小さくしてください。newは可能な限り少なくしてください。 C++はスタックが大好きで、スタックの割り当てと割り当て解除は自動的かつ安価です(新規ではなく、削除なし)。ポインタの代わりに参照とconst参照を使用してください。

あなた本当には、スマートポインタのいずれかを使用しようとすると、動的メモリを必要とする場合。

関連する問題