ここ数日、奇妙なケースをデバッグしており、バグをある程度分離しましたが、まだ意味がありません。おそらく、ここにいる誰かが何が起こっているのかについての手がかりを教えてくれるでしょう。
問題は、コードの一部で発生するアクセス違反です。
基本的に、次のようなものがあります。
void aclass::somefunc() {
try {
erroneous_member_function(*someptr);
}
catch (AnException) {
}
}
void aclass::erroneous_member_function(const SomeObject& ref) {
// { //<--scope here error goes away
LargeObject obj = Singleton()->Object.someLargeObj; //<-remove this error goes away
//DummyDestruct dummy1//<-- this is not destroyed before the unreachable
throw AnException();
// } //<--end scope here error goes away
UnreachableClass unreachable; //<- remove this, and the error goes away
DummyDestruct dummy2; //<- destructor of this object is called!
}
デバッガーでは実際に UnreachableClass を破棄しているように見えますが、DummyDestruct オブジェクトを挿入すると、奇妙なデストラクタが呼び出される前に破棄されません。したがって、LargeObject の破壊が失敗しているようには見えません。
これはすべて本番コードの途中にあり、小さな例に分離するのは非常に困難です。
私の質問は、これを引き起こしている原因と何が起こっているのかについて手がかりを持っている人はいますか? 非常にフル機能のデバッガー (Embarcadero RAD studio) を使用できますが、どうすればよいかわかりません。
続行する方法について誰かアドバイスをもらえますか?
アップデート:
DummyDestruct オブジェクトを throw 句の下に配置し、デストラクタにブレークポイントを配置しました。このオブジェクトのデストラクタが入力されます (そして、このコードには私たちだけが含まれています)。