でアクセス違反が発生mfc90d.dll
してCObject:IsKindOf
います。これは、コールスタックの最も深い項目で、実際にはずっと前に実行さWinMainCRTStartup
れているようです。これは、アプリケーションのモデルオブジェクトのいくつかの標準コンテナを作成したため、おそらく私のアプリにあります。 std::map<int, CDevice*>
どこかで、次のテンプレート化されたコンテナC ++タイプが存在し、コールスタックに表示されます。
myapp.exe!std::_Tree<std::_Tmap_traits<int,CDevice
*,std::less<int>,std::allocator<std::pair<int const ,CDevice *> >,0>
>::_Copy(const std::_Tree<std::_Tmap_traits<int,CDevice
*,std::less<int>,std::allocator<std::pair<int const ,CDevice *> >,0> > &
_Right={...}) Line 1067 + 0x1d bytes C++
それが理由であると100%確信しているわけではありませんstd::map<int, CDevice*>
が、私が見つけたのは「CDevice*」に関連する唯一のテンプレートリファレンスです。
わずかに簡略化されたコールスタック全体(省略記号...
は、関数シグネチャの一部の詳細が省略されていることを示します)。
mfc90d.dll!CObject::IsKindOf(const CRuntimeClass * pClass=0x691a09ec)
mfc90d.dll!CDocManager::OpenDocumentFile(const char * lpszFileName=0x007783e8)
mfc90d.dll!CWinApp::OpenDocumentFile(const char * lpszFileName=0x007783e8)
myapp.exe!CServerApp::InitInstance()
mfc90d.dll!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * ...
myapp.exe!__tmainCRTStartup() Line 574 + 0x35 bytes C
myapp.exe!WinMainCRTStartup() Line 399 C
kernel32.dll!762033aa()
ntdll.dll!77369ef2()
ntdll.dll!77369ec5()
myapp.exe!std::_Tree<std::_Tmap_traits<int,CDevice ..........
質問:
std::_Tree<...>::_Copy
のようなものが、上の4つの呼び出しレイヤーレイヤー全体で非常に多くのレイヤーを実行する方法について少し不思議に思っていますmyapp.exe!WinMainCRTStartup
。上記のコールスタックが正しくないことを疑う必要がありますか?std :: _ Tree <...>は、上記のような混乱とは何ですか?なぜそれが呼び出されるの
CObject:IsKindOf
ですか?私のコードは次のようなSTLを使用していますstd::map<int, CDevice*>
。
私の推測では、へのすべての参照を削除するとstd::map<int, CDevice*>
、上記のstd::_Tree
内部実装コードはなくなります。これをはるか前
WinMainCRTStartup
に実行すると、このコードが実際にmfc90d.dll
ロード時に実行されることがわかります。それはおそらくそうですか?「このコードはいつ実行されているか」をより明確に把握するために、VC ++ 2008デバッガーでできることはありますか?アプリケーションの存続期間の早い段階で、いったいどのようにクラッシュが発生する可能性があるかを誰かに推測してもらうのは無理です。私はあなたがそのような問題をどのようにデバッグするかに興味があります、それでこれのどれかがあなたのために鐘を鳴らしたら、私はあなたの考えと考えに感謝します、しかし誰かに実際に何が起こっているのか推測するように頼むのは多すぎます。どういうわけか、それはランダムなヒープの破損だとだけ言っておきましょう。ただし、「dllでのMFCの使用からMFCの静的リンクへの切り替え」の順序に関するヒントがあれば、ぜひ聞いてみてください。