C 関数例外処理でよくある落とし穴: 無効なメモリを指すことを避けるために、例外処理ブロックでローカル変数参照またはポインタを返さないようにします。元の例外情報の上書きを避けるために、例外処理ブロックで例外を繰り返しスローしないでください。 noexc 指定子は、関数が例外をスローしないように注意して使用してください。スマート ポインターと例外仕様を使用して、安全性を向上させ、ダングリング ポインターの問題を回避します。
C 関数の例外処理における一般的なトラップ
実践的なケース
前提条件は関数 doSomething()
であり、MyException
例外をスローする可能性があります:
void doSomething() { if (condition) { throw MyException(); } // 其他代码 }
トラップ 1: 例外処理ブロックで参照を返す
問題: 例外処理ブロックでローカル変数への参照が返された場合、関数が終了すると、その参照は無効なメモリを指します。
コード例:
string& getSomething() { try { string s = "Hello"; return s; // 引用局部变量 s } catch (exception& e) { // 处理异常 } }
トラップ 2: 例外処理ブロックでポインタを返す
問題:トラップ 1 と同様に、ローカル変数へのポインタが例外処理ブロックで返された場合、関数の終了時にポインタは無効なメモリを指します。
コード例:
int* getSomething() { int n; try { n = 10; return &n; // 返回局部变量 n 的指针 } catch (exception& e) { // 处理异常 } }
トラップ 3: 例外を繰り返しスローする
問題:If Throw例外処理ブロック内で別の例外が再び発生すると、元の例外の情報は上書きされます。
コード例:
void doSomething() { try { throw MyException(); } catch (MyException& e) { throw logic_error("New error"); // 重新抛出另一个异常 } }
トラップ 4: 悪用no例外
問題: 関数が noExcept
指定子で署名されているにもかかわらず、実際には例外をスローする可能性がある場合、プログラムがクラッシュする可能性があります。
コード例:
void myNoexceptFunction() noexcept { throw MyException(); }
注意事項
noexcel
: 関数が実際に例外をスローしない場合にのみ、noexcel
を使用してください。 std::shared_ptr
のようなスマート ポインターを使用します。 以上がC++ 関数の例外処理でよくある落とし穴は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。