2010-11-24 20 views
9

次のコードは、ダングリング参照を生成します。ダングリングリファレンス。ぶら下がっているポインタと参照の代替?

int main() 
{ 
    int *myArray = new int[2]{ 100, 200 }; 
    int &ref = myArray[0]; 
    delete[] myArray; 
    cout << ref; // Use of dangling reference. 
} 

私は、誰かがこれにメモリを削除した場合、私は参照を持っているもの、大きなプログラムで配列を削除してもいけません知っていますか?誰も配列を削除しないと何とか保証できますか?

ダングリング・リファレンスとダングリング・ポインタに対する最善の戦略は何ですか?

+0

おそらく 'boost :: shared_ptr'。 –

+1

http://stackoverflow.com/questions/395123/raii-and-smart-pointers-in-c。あるいは、この例では、最善の選択肢はそれをしないことです。 –

+1

動的に割り当てられた配列の最良の代替手段は 'std :: vector'です。 C++では 'new []'と 'delete []'を使う必要はほとんどありません。しかし、それでもイテレータと参照は無効になります。一般的に、長い寿命を持たない人には、長期的な参照はしないでください。 – UncleBens

答えて

12

終了する前にメモリを削除しないでください。

あなたの唯一の保護です - 各変数の背後にあるメモリを誰が所有しているのか、安全に解放できるのかを正しく理解してください。

スマートポインタが役立ちますが、上記は適用されます。

いくつかの静的解析ツールでは、ここにある簡単なケースを特定することができますが、その場合でも、メモリ管理の最初の訓練が必要です。

+0

+1、かなり:) –

+1

私は、私はメモリを削除すべきではない知っているが、これは大きなプログラムで制御することはできません。すべての開発者にarrayXYZを削除しないように頼むことはできません。しかし私はsmartpointersが私が探していたものだと思う。ありがとうスティーブ – blueskin

+0

しかし、再び問題は、コレクションやスマートポインタの配列を持つことができないですか? – blueskin

7

それらを保つには、適切にスコープ:

int main(){ 
    int *myArray; 
    myArray = new int[2]{ 100, 200 }; 
    { 
    int& ref = myArray[0]; 
    // use the ref here 
    cout<<ref; \\no longer a dangling reference 
    } // ref falls out of scope here 
    delete[] myArray; 
} 
+0

良い点 - 可能な限りRAIIとスコープを使用します。 –

3

良いプログラミング手法。コンパイラはあなたに十分なロープ以上の吊り下げを与えます。あなたがしないことを確認するのはあなたの責任です。

つまり、配列への参照を取り除いてから削除すると、問題は発生しません。

"でも、とにかく起こったらどうしますか?"

本当に簡単な答えはありません。それは、訓練と使用しようとしているツールの使い方を知っていることです。

+1

"十分なロープ" .. LOL .. thats true – blueskin

3

患者:医師は、私は これを行うとき、それは痛い...

博士:それへの参照を持ちながら、その後

...それをやって停止するにはメモリを解放しないでください。


それをキャッチする唯一の方法は、デバッグにあるEDIT

、良いユニットテストを持っているとvalgrindの下で実行、またはValgrindの下に、あなたのプログラムを実行します。

+0

私は質問にさらに追加しました。私の質問は、私が求めようとしていたものを完全に表現するものではなかった。ありがとう – blueskin

+1

@blueskin答えは(と他のすべての)まだ有効です。 "しないでください"、あなたの参照が無効かどうかをチェックする方法がありません(またはポインタが無効なメモリ位置を指している) –

+1

ya ..私は理解しています。悲しいことにそれは本当です..私は私のインタビューでこれを尋ねられ、解決策を尋ねられたらどうなりますか?私は "それをしないでください"と言うことはできません:D .. – blueskin

3

ここでのすべての回答は「注意してください!」、「良いプログラミングプラクティスを使用する」の3つです。
これはあまり満足のいく回答ではありません。これらの問題は40年以上にわたってC言語に存在しており、かなりの規模のC++プロジェクトでは依然として共通しています。人々はお勧めあなたが聞く

最大のガイドラインは以下のとおりです。

  • 使用スマートポインタ
  • 使用RAII

両方に該当するが、あなたが行うことができ、よりがあります。

2015年にStandard C++ FoundationがGuidelines Support Libraryをリリースしました。

静的型の安全であり、リソースリークが でないC++プログラムを記述できます。 C++の表現力を制限することなく、パフォーマンスを損なうことなく、 を実行できます。このタイプのモデルと リソースセーフC++は、ISO 標準C++言語機能、静的解析、および小さなサポート ライブラリ(ISO標準C++で書かれています)の組み合わせを使用して実装されています。

静的解析ツールでGSLのOwner<>を使用することをお勧めします。
これは安全な動作を保証します。

関連する問題