我遇到的问题是我的应用程序全局变量析构函数没有被调用。这似乎只有在我的应用程序成功连接到oracle数据库(使用OCI)时才会发生。
我在CRT中放了一些断点,似乎没有用DLL_PROCESS_DETACH调用DllMain(或__DllMainCRTStartup),因此没有调用atexit(),这解释了为什么我的析构函数没有被调用。 我不知道为什么会这样。
我意识到这可能不足以说明原因,但我的问题是:找出这个问题的原因会有什么好的开始?
这是我已经尝试的一系列事项:
答案 0 :(得分:2)
我遇到的最常见情况是程序崩溃。在某些情况下,从最终用户的角度来看,崩溃可能会无声地发生。我会将一个调试器附加到该程序,将其设置为中断所有本机异常并运行该方案。
答案 1 :(得分:2)
有人可能正在调用TerminateProcess
,这与ExitProcess
不同,不会通知DLL关闭。
答案 2 :(得分:0)
答案 3 :(得分:0)
调用exit
API通常意味着应用程序退出而不调用析构函数。在这种情况下,我不确定VC是做什么的。
另外,请尝试避免使用全局对象。这是因为您几乎无法控制构造函数和析构函数的调用时间和顺序。而是将对象转换为指针,并使用适当的DllMain
挂钩初始化和销毁指针。由于DllMain是OS构造而不是语言构造,因此在正常退出的情况下它应该更可靠。