私はC++にかなり慣れていませんが、Microsoftにバグを報告する前に、ここで何か間違ったことをしていないことを確認したいと思います。
サンプルコードは次のとおりです。
#include <system_error>
using namespace std;
class Test
{
public:
~Test()
{
throw system_error(5, system_category());
}
};
Test test;
void testfunc()
{
throw system_error(5, system_category());
}
void main()
{
try
{
testfunc();
}
catch ( const system_error& e)
{
}
}
さて、私はWindowsが「ランタイムがプログラムを予期しない方法で終了するように要求した」と言うことを期待します。ただし、代わりに「純粋仮想関数と呼ばれる」エラーが発生します。少しデバッグすると、静的クラスのデストラクタがstd::system_category
参照を取得すると、::name
および::message
メンバーが純粋な仮想であることに気付きました。ただし、で構築されている場合testfunc()
、これらのvtableポインターは有効な関数を指します。
私の質問は、system_error
このように例外を作成することで何か間違ったことをしているのでしょうか?私は基本的にやっていたいくつかのコードを持っていthrow system_error(GetLastError(), system_category());
ました。これはたまたま静的デストラクタで実行され、エラーと呼ばれる純粋仮想関数を取得しました。
WindowsのGetLastError()
関数から例外をスローするには、例外を別の方法で作成する必要がありますか、それともmsvc11のC ++ランタイムのバグですか?
編集
私の質問について少し混乱がありました。私の実際のコードはこの例よりも複雑であり、実際には、デストラクタの1つがスローされるとは思っていませんでした。私のデストラクタは、スローする可能性のある関数を呼び出す必要があります。コードを次のように変更した場合:
~Test()
{
try
{
callSomeFuncThatCouldThrow();
}
catch ( … ) { }
}
I will still get the pure virtual function call error. This is because when the system_error is constructed (in callSOmeFuncThatCouldThrow()
) it tries to use the ::message
member of the system_category
I'm giving it, which causes the error.