スローした例外クラスの (少なくとも私にとっては) 非常に奇妙な動作に遭遇しました。私がしていることnew
は、例外クラスのコンストラクターで文字列を介してメモリを割り当て、文字で埋めることです。これまでのところ、すべて問題ありません。コードをデバッグすると、ポインターが実際に正しいコンテンツを持っていることを Visual Studio で確認できます。
今、奇妙なことが起こります。私の次のブレークポイントは、構築後に例外が渡される 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 - ブロックの使用方法を誤解していたのかを誰かが教えてくれれば、それは素晴らしいことです。