2012-02-23 8 views
2

をメモリリークを防ぐために、どのような方法があり、私たちは、メモリリークを防ぐために、いくつかの方法があり、このような現在、C++でそれに特別な注意を払うように開発者を求めず

  1. プロキシ(shared_ptrの、auto_ptrを)と
  2. として簿記方法は、
  3. ガベージコレクション(Java)の

しかし、前者は、開発者から多くのオーバーヘッドと後で原因の一つ多くのリソースのオーバーヘッドを必要とします。

この問題のリソース効率の良い、無料の開発者は他にもありますか?

+1

をなし価格のためにそれを取り除くための万能ソリューションは、あなたがそれをそこに考えていないだろうしている場合すべての初心者のC + +の本で宣伝されるだろうか? – PlasmaHH

+2

@PlasmaHH:RAIIは確かに*すべての初心者の本に広告されるべきです。残念ながら、私は多くの人がそれを早期に教えていないと思う。 –

+2

0.スタック変数。漏れません。あなたはそれを試してみる必要があります。 RAIIの発言を参照してください。 –

答えて

7

C++で特別な注意を払うように開発者に依頼せずにメモリリークを防ぐ方法はありますか?

が厳密に必要な場合にのみ、が本質的に使用します。
ダイナミックアロケーションを使用している場合は、それが提供する価格に従わなければならず、それが正しく処理されます。これを行う最善の方法は、C++でRAIIを使用しています.RAIIコードを書くことは自明ではありませんが、練習ではRAIIの方法で考えるのに慣れています。

+1

+1 "最小限の動的割り当てを使用**厳密に必要な場合にのみ** **" * – Nawaz

+1

私は同意しません1点:RAIIを書くことは自明です。少なくともC++のメモリを管理する他のものと比較して。私は特に、shared_ptrをref-to-const以外のもので渡すという罠について考えています。 –

+0

スコープ・バウンド・リソース管理(SBRM、RAIIのより良い名前)をスコープ出口タイプのユーティリティーで簡単に行うことができるので、小さなユーティリティクラスをたくさん書く必要はありません。 – GManNickG

0

よく練習すると良いプログラミングになる習慣そして、それらを利用するために必要な "注意"はほとんどありません。私はstd :: unique_ptr、std :: shared_ptrなどのRAIIラッパーオブジェクトを使用することをお勧めします。
好きな場所は、deleteという単語を入力した人がいる場合は、注意しなければならないフラグにする必要があります。

これは、動的割り当てを使用しないでください(絶対に必要な場合を除いて)、自動的に破壊されたスコープ制御オブジェクトを可能な限り使用してください。 NEVER newはRAIIオブジェクトです。これにより、スコープが変更された場合にRAII所有者がラップするオブジェクトの処理方法を考える必要があります。例えば

std::auto_ptr<Foo> ptr2Foo(new Foo()); 
... 
... 
if(ptr2Foo->isValidNow()) 
    passToOwningObject(otherObject, ptr2Foo); 
//now when scope ends the newed Foo will be destroyed or owned 
//by an appropriate object. 

または

std::unique_ptr<Foo> ptr2Foo(new Foo()); 
... 
... 
if(ptr2Foo->isValidNow()) 
    passToOwningObject(otherObject, std::move(ptr2Foo)); 
//now when scope ends the newed Foo will be destroyed or owned 
//by an appropriate object. 

、定期的に(MSVC、Valgrindは、コベリティ等...)コードanaylsisを実行し、コンパイラの警告を無視しないでください。

+0

所有権を渡すために 'unique_ptr'を' std :: move'する必要があります。 – Xeo

+0

@ Xeo - opps。私はまだそれらを使用していない(VC9で)...自動車は私が実際に使っているものなので、それに変わった。 – Dennis

0

私はいつも参照を使用していると感じていましたが、参照渡しと渡しは可能な限り正確に行うことができます。参照を削除することはできませんので、期待していません。あなたはconstポインタを削除することはできませんので、あなたは期待していません。次に、それらの希少な機会に、コーダーは通知を取る非constポインタを渡します。

ヒープ割り当てオブジェクトの所有権の考え方に本当に注意を払い、曖昧にそれらを公開/公開してください。また

、例えば、手がかりを与えるために、より完全なインタフェースを書く:

class DataWrapper 
{ 
public: 
    const BYTE* PeekAtData() const;   
    BYTE* RemoveData(); 
.... 
}; 
+0

ポインタをconstに完全に細かく削除することができます。[this](http://ideone.com/PdS99)を参照してください。 – Xeo

+0

私は本当に話題から漂っている "混乱している"と言っていたはずです。しかし、私が見てきたコードは、すべてが裸のポインタとしてぶつかってしまっていて、メモリリークや腐敗が同じ悪い習慣の中にあります!やあ、私は怒っている...:) –

関連する問題