私が投げた例外クラスの動作は非常に奇妙です(少なくとも私にとって)。私は、例外クラスのコンストラクタ内の文字列にnew
を介してメモリを割り当て、文字でそれを埋めています。これまでのところすべてが問題ありません。コードをデバッグするとき、私はVisual Studioでポインタが実際に正しい内容を持っていることがわかります。catchポインタの内容がキャッチブロックに渡されている間に削除されているようです
今、奇妙なことが起こります。私の次のブレークポイントは、構築後に例外が渡されるcatchブロックにあります。ここでは、例外オブジェクトに含まれる文字列の内容が壊れていることをデバッガで確認できます。アドレスはまったく変わっていませんでしたが!それで、文字列の内容が破壊されるようです。
私は例外デストラクターにブレークポイントを入れて、本当にcatchブロックが入る前に呼び出されています。 catchブロックを参照して例外を渡すことを学んだので、これは私をたくさん混乱させます。場合
#include <iostream>
#include <cstring>
class test_exception {
public:
test_exception();
~test_exception() {
delete[] _msg;
}
// Getter Functions
char* errorMessage() const {
return _msg;
}
private:
char* _msg;
};
test_exception::test_exception()
{
_msg = new char[22];
strcpy(_msg, "This is a test string");
}
int main(int argc, char* argv[])
{
try {
throw test_exception();
} catch (const test_exception& err) {
std::cout << err.errorMessage() << std::endl;
}
std::cin.get();
return 0;
}
それが作成されます。しかし、何が良い私は、動的に作成されたデータにアクセスすることができます前に、デストラクタが呼び出された場合ということ...
私は私は状況がで示し、最小限の例を構築しました誰かが私に奇妙なMSの動作であるか、try-catchブロックをどのように使用すべきか誤解しているかどうかを教えてくれました。
ありがとうございました!私はそれを知らなかった。 catchブロックで参照を使用していたので、例外をスローするときに作成したオブジェクトを使用していると思っていました。もちろん、これで説明します。また、リンクをありがとう! – Cyianor