2011-06-28 16 views
8

私は以下のコードを持っていますが、その場合delete bが必要なのでしょうか? 私のオペレーティングシステムは、割り当てられたメモリ領域を自動的にクリアしますか?デストラクタで削除が必要ですか?

class A 
{ 
    B *b; 

    A() 
    { 
     b = new B(); 
    } 

    ~A() 
    { 
     delete b; 
    } 
}; 

多くのありがとう。

+5

['A'はコピーコンストラクタと代入演算子も必要です。](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) – GManNickG

答えて

10

はい、あなたはdeleteにあなたがを所有newで作成したすべてのオブジェクトを持っています。この場合、class Aのインスタンスはclass Bのインスタンスを所有しており、deleteを呼び出す必要があります。

スマートポインタを使用して、class Bインスタンスの有効期間を管理するほうがずっと良いでしょう。また、代入演算子とコピーコンストラクタをclass Aに実装または禁止する必要があります。これは、オブジェクトを浅くコピーすることによって大きな問題を引き起こさないようにするためです。

1

あなたが書いた方法で確かに必要です。しかし、deleteがあっても、リソースを管理しているのに、the rule of threeに従わないため、クラスは根本的に壊れています。

しかし、手動メモリ管理の理由はほとんどありません。ほとんどありません。

struct A 
{ 
    QScopedPointer<B> b; 
    A() : b(new B()) { } 

    // No ~A() needed; when the A object is destroyed, QScopedPointer ensures 
    // that the B object pointed to by the member 'b' is destroyed and deleted. 
}; 

あなたはa good introductory C++ bookので、あなたができることを持っていることを確認するだろう:それはあなたがどちらかだけのメンバ変数としてBオブジェクトを持つべきか、QScopedPointerのように、スマートポインタを使用すべきであると考えられます正しいC++プログラムを書く方法を学んでください。

5

あなたのオペレーティングシステムは割り当てられたメモリを解放しますが、これはプログラムが終了したときに行われます。長い間実行されているプログラムは、メモリの問題に遭遇します。

スマートポインタを動的にコートしたオブジェクトに使用することをお勧めします。これらはあなたのためのすべての削除を行います。

  • のstd :: auto_ptrを
  • ブースト:: shared_ptrの
  • ブースト:: scoped_ptrを
1

すべての時間を割り当てられたプロセスが終了した場合にのみ、それはエリアをクリアしますが、エリアが残りますそれまではmemory leakを意味します。

2

新しいものを呼び出すと、対応する削除が常に推奨されます。

オペレーティングシステムがメモリを削除する限り、そうですが、プロセス全体が終了した後(つまり、アプリケーションが終了した後)にのみ発生します。その後、すべてのメモリと他のリソースはOSによって回収されます。

第3に、必要に応じて新しい/削除を使用するようにしてください。あなたのシナリオでは、書き込むことができます

class A 
{ 

B b; 

    A() {} 

    ~A() {} 

}; 

これは同じ効果があり、余分な動的メモリ割り当てを避けることができます。

0

bメンバーはヒープに割り当てられます。オペレーティングシステムがヒープによって占有されているすべてのメモリを解放することは事実です。しかし、それは一度だけ起こるでしょう:プログラム出口で

したがって、割り当てられたヒープブロックが(通常はオブジェクトのデストラクタで)使用されなくなるときに解放しないと、memory leakになる可能性があります。

だから、答えは基本的に次のとおりです。はい、あなたは(スマートポインタが似た何かを達成するためのお手伝いをしますが)、メモリが自動的にできるだけ早く解放されませんよう、手動deleteを呼び出す必要があります。

0

newで割り当てたものはdeleteで解放する必要があります。それ以外の場合は、アプリケーションにメモリリークがあります。

最近のオペレーティングシステム(ほとんどの場合、デスクトップコンピュータで通常実行されるOS)では、プロセスが終了するとクリーンアップされるので、deleteを忘れてもメモリは解放されます。しかし、あなたはこれに頼るべきです。

私はずっと前にCのAmigaにプログラムしました。そのオペレーティングシステムは、今日のオペレーティングシステムよりはるかに洗練されていませんでした。メモリを確保して解放しないと、プロセスが終了した後でも、コンピュータの電源を切ったり、コンピュータを再起動するまで割り当てられたままになります。メモリリークはさらに深刻な問題でした。

1

リソース管理は、単にメモリの割り当てを解除するだけではありません。はい、ほとんどのプラットフォームは、プロセスが終了したときに割り当てるメモリを作成します。メモリは十分安くて、しばらく気づかないかもしれません。しかし、ファイルbは開かれていますか、またはそのデストラクタでロックされるミューテックスはどうですか?あなたの記憶がなくなる前に、オブジェクトがその有用性を過ぎて生き残ることから、問題に遭遇することがあります。

0

1)長時間実行されているアプリケーションは、アプリケーションが実行を停止したときにのみメモリを再利用できるため、問題が発生します。

2)delete b;は、pointed-at Bインスタンスのデストラクタも実行させます。さもなければ、それを得る方法がもう存在しないので、それは決して実行されません。そのデストラクタは何か重要なことをするかもしれない。

関連する問題