私はMS Visual C++ 2005で書かれたアプリケーションを持っています。クライアントのコンピュータでは失敗しました。私は失敗を再現することはできません。分析のために必要なのは、アプリケーションによって作成されたログだけです。アプリケーションでは、私は次の断片います。ログでスタックオーバーラップ中に2つのデストラクタのうちの1つが呼び出されない
class EntranceLoggerForFunc
{
public:
EntranceLoggerForFunc()
{
WriteToLog("EntranceLoggerForFunc");
}
~EntranceLoggerForFunc()
{
WriteToLog("~EntranceLoggerForFunc");
}
}
void Func()
{
EntranceLoggerForFunc logger;
....
if (<some comdition>)
Func();
....
}
void Func2()
{
try
{
Func();
}
catch(...)
{
WriteToLog("Exception happened");
}
}
アプリケーションが(SEH例外とC++の例外を有効にするキー/ EHAでコンパイルされている
私は、以下を参照してください。
EntranceLoggerForFunc EntranceLoggerForFunc 〜EntranceLoggerForFunc 例外は、言い換えれば
が起こっ、例外はのFunc()内のどこかで起こりました。 dはFunc2()に捕らえられていた。しかし、なぜ、EntranceLoggerForFuncの2つのオブジェクトのデストラクタが、スタックの巻き戻し中に呼び出されただけですか?
私は次のバージョンしか持っていません:スタックは何らかの形で損傷しています(おそらく、例外を引き起こした同じ誤った操作によって)、これはデストラクタの1つが動作しなかった理由です。
他のバージョンはありますか?
問題を再現するコンパイル可能な例を投稿できますか? –
BTW-ご質問に常にお答えしてください。これがStackOverflowの仕組みです。左に緑色のチェックマークを付けることで、回答を「承認済み」とマークすることができます。 – Kos