4

throwたとえば、関数で使用する場合

try {
   // ...
   throw MyExceptionType()
   // ...
} catch(MyExceptionType& exp){ /* ... */ }

どこにMyExceptionType割り当てられますか?それはスタックにありますか?expもしそうなら、私のcatchブロックで変更しても安全ですか? 内部で他の関数を呼び出しcatchてスタックを使用するのはどうですか?

同様のケースで私は持っています:

try {
   char my_array[32];
   throw my_array; 
} catch(char* error_string){ /* ... */ }

error_stringプロセススタックのどこかを指していますか? catchブロック内でいくつかの関数を呼び出すと、配列をオーバーランできますか?

4

3 に答える 3

2

それは実装に依存します。 g++ 4.4はメモリを試行しmalloc、それが失敗した場合は、システム全体の緊急バッファで例外を構築しようとし、呼び出したものはすべて失敗しますstd::terminate

于 2013-09-03T13:10:12.093 に答える
1

これは実装に依存する動作であり、使用される ABI にも厳密に関連しています。

libsupc++linux/unix を使用している場合は、 GNU から参照することをお勧めします。

一言で言えば、他のライブラリと同様に、すべてのコンパイラ/C++ 標準ライブラリの標準実装があるわけではありませんが、指定された命令がライブラリの作成者によってどのように実装されているかを確認する必要があります。

于 2013-09-03T13:16:27.827 に答える
1

実装次第です。異なる実装には異なるポリシーがありますが、ほとんどの場合、静的またはスレッド ローカルの特別な事前割り当て領域が必要です。( throw に割り当てなければならない場合std::bad_allocは、面倒です。)

2番目のケースについては、配列からポインターへの変換がスローの前に発生するため、実際には似ていません。したがって、実際にはポインタを投げているだけです。ポインターのスペースは通常どおりに処理されますが、配列が宣言されたブロックを離れると、それはなくなります。ブロックでもcatch(あなたの例では)、それにアクセスすることは未定義の動作です。

于 2013-09-03T13:24:27.067 に答える