より効果的なCの研究ノート3:異常

1.デストラクタは、リソースリークを防ぎます

 

次のことを考えてみましょう:

void processAdoptions(istream& dataSource)
{
    while(dataSource)
    {    
        ALA *pa = readALA(dataSource);
        pa->processAdoption();
        delete pa;
    }
}

もしPA-> processAdoption()異常動作は、リソースリークを削除しません。

方法a:ラップのtry catchブロックが、この方法では、複数の重複したコード

方法2:包装ポインタ(ポインタインテリジェント)ポインタのようなオブジェクト内のオブジェクトは、デストラクタを解除されます。

 

思想:リソースを持つオブジェクトストアは自動的に解除して、リソースを解放するために、オブジェクトのデストラクタに依存します。これは、リソースのリークを回避するために、良いアイデアすることができ使用すると、異常な環境の存在下で起こりました。

 

コンストラクタでリソースリークを防止するために2

同上、およびコンストラクタで問題を回避するために、スマートポインタのポインタオブジェクトをパッケージ化。

class BookEntry{
public:
    ...
private:
    ...
    const auto_ptr<Image> theImage;
    const auto_ptr<Audioclip> theAudioClip;
}

BookEntry::BookEntry(const string& name, const string& address, const string& imageFileName, const string& audioClipFileName)
:theName(name), theAddress(address), theImage(imageFileName != "" ?
                                    new Image(imageFileName : 0),
                                   theAudioClip (audioClipFileName != "" ? new AudioClip(audioCipFIleName) : 0))
{

}

外側デストラクタに伝達異常情報を禁止3

Session::~Session()
{
    try{

    logDestruction(this);
}
castch(...){}


}

スローされた例外が外部デストラクタセッションに伝達されないように、すべての例外をキャッチ。

役割:

プロセスにおいては終了防止するために呼び出されて、異常転写のスタックを解明するために除去することができます

2.それはデストラクタは、常に完了することができますし、我々はそれがすべてのことをしたいことを確認することができます。

 

4.または「仮想関数呼び出し」「パラメータを渡す」「例外をスロー」の理解との違い

関数パラメータの受け渡しでの類似点と相違点のいくつかをキャッチする例外をスローします。

1.それらは参照することによりポインタ又はパスを渡し、値です。関数を呼び出すときには、制御プログラムは、最終的には、関数の呼び出し元に戻りますが、例外が例外を投げるの局所制御に戻ることはありませんスローされます。

オブジェクトをコピーすると例外がスローされるような仕様に合格しなければならない2.C ++は、パラメータを渡すの速度よりも遅く実行するようにスローされます。

3.例外オブジェクトがコピーされると、コピー動作は、コピー機能のオブジェクトによって実行され、オブジェクトがあるの種類に応じた静的クラスコピーコンストラクタ。

4.例外がキャプチャー正常基準によってスローされたオブジェクトには、キャプチャを指すことによってconstオブジェクトへの参照を必要としない、一時的なオブジェクトがタイプで非const参照パラメータへの関数呼び出しに渡すことが許可されていません。

5.catch(ウィジェットw)は、このような異常転写対象の2つのコピーを作成し、一時的なオブジェクトが確立されなければならないすべての例外は、第二の一時オブジェクトをW(にコピーされることで、スローされる2)スローポインタは、グローバルまたはヒープである必要があり、ローカルオブジェクトを指し示すことができます。

パラメータ6.catch(VaRの値)は一般的に暗黙的な変換が送信されず、変換は、派生クラスは、ベースクラスの間で変換することである異常マッチングcatch節Aの二種類であることができる、第可能型なしポインタへのポインタのいずれかのタイプから、catch節でのconst void *型のポインタは、例外のポインタ型のいずれかのタイプをキャプチャすることができます。

これらはソースコードに表示される順序と一致7.catch句例外型の配列は、第一のタイプは、正常に実行するcatachに一致します。

 

参照によってキャッチ例外

値または参照(ポインタ問題)によって捕捉。

値によって同様の機能(オブジェクトが関数に値によって渡されると、静的バインディング(型変換と、失われた多型をコピーすることが推定される))を用いて、問題となります

参照例外キャプチャすることによって、問題を回避、問題は、オブジェクトを削除したため、ポインタは、例外の標準タイプをキャプチャすることができません取り込みます。また、異常値によって捕捉されないこの方法は、問題をスライスせず、例外オブジェクトは一度だけコピーされます。

推奨参照は、例外をキャッチ。

 

6.注意例外の仕様

C ++ 11の使用 noexcept 

typeパラメータでテンプレートの例外仕様を使用して1.避けてください。

template<class T>
bool operator==(const T& lhs, const T& rhs) throw()
{
    return &lhs == &rhs;
}

テンプレートと例外仕様が混在していません。

 

例外仕様は、関数例外指定で他の関数を呼び出していないがある場合2.は、この機能を削除する必要があります。

 

例外処理のオーバーヘッドを理解する7。

 

 

 

 

 

 

 

 

 

 

 

 

公開された44元の記事 ウォンの賞賛5 ビュー1398

おすすめ

転載: blog.csdn.net/qq_33776188/article/details/104629039