没有调用全局变量析构函数,从哪里开始?

时间:2010-08-16 13:55:01

标签: c++ windows visual-c++

我遇到的问题是我的应用程序全局变量析构函数没有被调用。这似乎只有在我的应用程序成功连接到oracle数据库(使用OCI)时才会发生。

我在CRT中放了一些断点,似乎没有用DLL_PROCESS_DETACH调用DllMain(或__DllMainCRTStartup),因此没有调用atexit(),这解释了为什么我的析构函数没有被调用。 我不知道为什么会这样。

我意识到这可能不足以说明原因,但我的问题是:找出这个问题的原因会有什么好的开始?

这是我已经尝试的一系列事项:

  • 在网上搜索解决方案
  • 附加调试器并启用本机异常以查看没有隐藏的崩溃,有时我在.Net框架中获得异常,但应用程序似乎仍在继续。
  • 尝试在小型应用程序中重现,但没有成功

4 个答案:

答案 0 :(得分:2)

我遇到的最常见情况是程序崩溃。在某些情况下,从最终用户的角度来看,崩溃可能会无声地发生。我会将一个调试器附加到该程序,将其设置为中断所有本机异常并运行该方案。

答案 1 :(得分:2)

有人可能正在调用TerminateProcess,这与ExitProcess不同,不会通知DLL关闭。

答案 2 :(得分:0)

这可能会有所帮助:

What happens to global variables declared in a DLL?

您的全局变量是在dll中还是在应用程序的内存空间中声明的?

答案 3 :(得分:0)

调用exit API通常意味着应用程序退出而不调用析构函数。在这种情况下,我不确定VC是做什么的。

另外,请尝试避免使用全局对象。这是因为您几乎无法控制构造函数和析构函数的调用时间和顺序。而是将对象转换为指针,并使用适当的DllMain挂钩初始化和销毁​​指针。由于DllMain是OS构造而不是语言构造,因此在正常退出的情况下它应该更可靠。